我一直在我正在创建的库中使用一种模式,该模式使用将对象的字符串名称传递给其基础对象的构造函数。我尝试过使用 std::string 和 c 风格的字符串,但是 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,因为它的名称已损坏,并且我希望名称为“正常”以用于脚本/数据持久性。