Я использую шаблон в библиотеке, которую я создаю, которая использует строковое имя объекта для своего конструктора базового объекта. Я попытался использовать строки std :: string и c-style, но продолжаю получать странные ошибки памяти с помощью Valgrind.Назначение строки времени компиляции для идентификации во время выполнения
class Base {
public:
Base(std::string name) : name(name) {}
virtual ~Base() {}
std::string getName() { return name; }
private:
std::string name;
};
class Derived : public Base {
public:
Derived() : Base("Derived") {}
};
int main() {
Base* derived = new Derived;
std::cout << derived->getName() << "\n";
delete derived;
}
(компилируется и работает нормально, в Valgrind)
Это что-то вроде этого безопасно? Я использую 'const char *' вместо 'std :: string' прямо сейчас, это безопасно?
Есть ли более безопасная альтернатива, желательно без использования виртуальных?
Редактировать: Есть ли способ сделать это с помощью шаблонов? Я не хочу использовать RTTI, так как он имеет имя искаженное, и я хочу, чтобы имя было «нормальным» для использования с поддержкой сценариев/данных.
Ваш базовый класс должен иметь виртуальный деструктор (вероятно, это причина ошибок, которые вы видите). Кроме того, вы должны использовать 'unique_ptr' или' shared_ptr' вместо исходных указателей. – syam
Только что проверено, все базы виртуальны в моем коде. – h4tch
Для строковых литерал-констант не используйте умный указатель a la 'std :: unique_ptr (« hello »)', потому что 'char const *' указывает на статическое хранение данных, а не на кучу. И я не вижу здесь вопроса, этот код является безопасным и точным, но, по-видимому, не представляет собой проблемную часть. –
Potatoswatter