2

所以我想有vector<OtherClassName> theVector一个成员BaseClass

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

这样做会导致内存泄漏吗?

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

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

4

2 回答 2

1

这样做会导致内存泄漏吗?

的,这将导致内存泄漏。每个分配的对象都new必须用 销毁delete。否则会导致内存泄漏。

特别是,您在此处存储在向量中的是分配给 的对象的副本new。如果你想让你的容器保存某个类的对象,这样做就足够了:

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

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

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

#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);
}

在现代 C++ 中,通过手动内存管理newdelete认为是不好的编程实践,因为它很容易导致内存泄漏或未定义的行为,并在健壮性、可读性和易于维护性方面对程序设计产生负面影响。

于 2013-03-27T19:20:32.890 回答
0

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

于 2013-03-27T19:24:43.190 回答