J'ai utilisé un modèle dans une bibliothèque que je crée qui utilise passe un nom String d'un objet au constructeur de son objet de base. J'ai essayé d'utiliser les chaînes std :: string et c-style, mais je continue d'avoir des erreurs de mémoire bizarres avec Valgrind.Attribution de chaîne de temps de compilation pour l'identification d'exécution
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;
}
(Ceci compile et fonctionne très bien dans Valgrind)
Est-ce quelque chose comme ce coffre-fort? J'utilise 'const char *' au lieu de 'std :: string' en ce moment, est-ce que c'est sûr?
Existe-t-il une alternative plus sûre, de préférence sans utiliser de virtual? Edit: Y a-t-il un moyen de faire cela avec des templates? Je ne veux pas utiliser RTTI car le nom est tronqué et je veux que le nom soit 'normal' pour être utilisé avec les scripts/persistance des données.
Votre classe de base a besoin d'un destructeur virtuel (c'est probablement la cause des erreurs que vous voyez). En outre, vous devriez probablement utiliser 'unique_ptr' ou' shared_ptr' au lieu de pointeurs bruts. – syam
Juste vérifié, toutes les bases sont virtuelles dans mon code. – h4tch
Pour les constantes littérales de chaîne, n'utilisez pas un pointeur intelligent a la 'std :: unique_ptr (" hello ")' car le 'char const *' pointe sur le stockage de données statique, pas sur le tas. Et je ne vois pas la question ici, ce code est sûr et bien mais apparemment ne représente pas la partie problématique. –
Potatoswatter