向量中的动态对象创建

时间:2013-03-27 19:17:38

标签: c++ memory-leaks dynamicobject

所以我希望vector<OtherClassName> theVector成为BaseClass

的成员

我想知道在很多方面我可以得到内存泄漏......

这会导致内存泄漏吗?

BaseClass::someFunction(){
   OtherClassName * c = new OtherClassName();
   theVector.push_back((*c));
}

我是C ++的初学者,从互联网上学习。

2 个答案:

答案 0 :(得分:1)

  

这会导致内存泄漏吗?

,这会导致内存泄漏。分配有new的每个对象都必须使用delete销毁。如果不这样做会导致内存泄漏。

特别是,您在向量中存储的内容是分配有new的对象的副本。如果您希望容器保存某个类的对象,则可以执行以下操作:

BaseClass::someFunction()
{
    OtherClassName c;
    theVector.push_back(c);
}

请注意,vector与C ++标准库的所有容器一样,具有值语义:这意味着您在向量中插入的内容是副本push_back()的对象的em>。对原始对象的进一步修改不会反映在向量中包含的对象的状态,反之亦然。

如果您希望这种情况发生,即如果您需要引用语义,则必须让您的向量包含(可能是智能的)指针。例如:

#include <memory>

// theVector would be declared as:
// std::vector<std::shared_ptr<OtherClassName>> theVector;

BaseClass::someFunction()
{
    std::shared_ptr<OtherClassName> pC = std::make_shared<OtherClassName>();
    theVector.push_back(pC);
}

通过newdelete进行手动内存管理在Modern C ++中被认为是糟糕的编程习惯,因为它很容易导致内存泄漏或未定义的行为,并对设计产生负面影响您的程序在稳健性,可读性和易维护性方面。

答案 1 :(得分:0)

动态创建任何内容的类应该有一个析构函数,在销毁对象时释放内存。如果您没有内存泄漏。新语句占用的任何内存必须具有相应的删除语句,否则您将发生内存泄漏。由于您的类现在被写入,因此您将永远不会释放内存,因此会出现内存泄漏。你的析构函数应该简单地遍历向量并从它存储的每个指针中释放内存。