2013-03-13 64 views
0

我有一个类Bar,其构造初始化Foo类型(另一个类)的std::vector内存泄漏,矢量后推C++

Bar.cpp

Bar::Bar(int n) { 
for(int i = 0; i < n; i++) { 
    Foo foo; 
    foo.somefunction(i); 
    vec.push_back(foo) //this should insert foo into the vector 
    } 
} 

Bar.h

class Foo; 
class Bar { 
std::vector<Foo> vec; 
}; 

当我调试,施工的第一次迭代工作正常。 foo已创建,foo.somefunction()正常运行,并且foo被推入vec

第二个interation似乎也很好,但程序崩溃时,它回到开始第三次迭代。

我得到_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)错误和HEAP CORRUPTION DETECTED

Foo是一个包含动态创建数组的类,没什么特别的。 事情是这样的:

Foo::Foo() { 
    solution = new float[size]; 
    // some function that initializes the elements of solution 
} 

和常规析构函数~Foo() {delete [] solution;}。我不认为问题来自Foo

+2

规则三可能。 – chris 2013-03-13 17:25:55

+4

你已经使用了'Foo'的矢量。你为什么不使用“浮动”的矢量呢?我敢打赌你的问题会神奇地消失。 – jrok 2013-03-13 17:27:59

+0

我试过用这种方法声明一个float的向量: std :: vector vec(size); 但它不起作用。任何方式来声明在运行时确定的大小的向量? – jazzybazz 2013-03-13 17:50:54

回答

4

很可能您没有正确实施copy constructoroperator =,并且您正在双删除solution。如上所述,您还应该阅读The Rule of Three

C++标准容器store copies等等,当你做一个push_back你正在复制。

+0

谢谢,我想我会摆脱动态数组,并使用float的向量。 – jazzybazz 2013-03-13 17:49:05

+0

@jazzybazz这可能是最简单的解决方案 – 2013-03-13 20:22:17

0

看起来你没有在类Foo中实现拷贝构造函数。在Bar构造函数中,迭代结束时会创建并销毁每个迭代的Foo新实例。因此,在Foo中分配的内存被销毁,但将Foo实例复制到向量的默认拷贝构造函数没有将您分配的内存复制到“new”,只是复制了指针。所以在每次迭代之后,每个向量元素都被破坏了。假设该向量在开始时为您的对象分配了一些内存。然后,当缓冲区中没有地方,并且他无法再增长该缓冲区时,向量将分配新的内存,并发生另一个复制操作。当复制操作完成时,需要释放旧的缓冲区,并且向量销毁旧缓冲区中的所有对象,并且每个对象中的析构函数都会在损坏的指针上调用delete []。