2013-03-27 115 views
2

,所以我想有vector<OtherClassName> theVector作为的BaseClass动态对象创建

我在很多方面,我可以得到一个内存泄漏想一员......

意愿这样做的结果内存泄漏?

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

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

+0

如果您想学习C++,您可能需要阅读[良好的C++书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。从互联网上零散地学习C++是一个缓慢而容易出错的过程。 – Blastfurnace 2013-03-27 19:34:50

回答

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

通过newdelete手册内存管理被认为是不好的编程习惯在现代C++,因为它容易导致内存泄漏或不确定的行为,并影响你的程序的设计方面坚固性,可读性和易维护性。

+0

谢谢,这有助于很多..你解释_value语义_和_reference语义_的方式真的帮助我.. :) – jujiyangasli 2013-03-27 22:44:18

+0

@jujiyangasli:好的,我很高兴它帮助。如果您发现此问题可以解答您的问题,请考虑将答案标记为已接受(或您可能更喜欢的其他答案)。并祝你的学习过程;-) – 2013-03-27 22:48:47

+0

@sftrabbit:这只是感谢过度慷慨的OP谁决定奖励我的赏金。除此之外,看起来你最近比我做得更好;) – 2013-03-28 00:13:07

0

动态创建任何东西的类应该有一个析构函数,当对象被销毁时释放内存。如果你没有一个你有内存泄漏。任何由新语句取得的内存都必须具有相应的删除语句,否则将发生内存泄漏。由于你的班级现在已经写好了,因为你再也没有释放内存,所以它会有内存泄漏。你的析构函数应该简单地通过矢量并从存储的每个指针中释放内存。