C++ 内存泄漏,向量后推c++;

C++ 内存泄漏,向量后推c++;,c++,memory,vector,heap,memory-leaks,C++,Memory,Vector,Heap,Memory Leaks,我有一个类Bar,它的构造函数初始化类型为Foo(另一个类)的std::vector 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 } } 和常规析构函数~Foo(){delete[]solution;}。我不认为问题

我有一个类
Bar
,它的构造函数初始化类型为
Foo
(另一个类)的
std::vector

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

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

很可能是您没有正确实现
复制构造函数和
运算符=
,并且您正在双重删除
解决方案。如前所述,您还应该阅读


C++标准容器,因此当你做一个代码> PuxSuffue/Cuff>你正在制作一个拷贝。

很可能你没有实现<代码>复制构造器< /C>和<代码>运算符=/COD>正确,并且你是双重删除<代码>解决方案< /代码>。如前所述,您还应该阅读


<> C++标准容器,因此,当你做一个代码> PuxSubje<代码>时,你正在制作一个拷贝。

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

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

规则可能是三个。您使用的向量是
Foo
s。为什么不使用
float
s的向量呢?我打赌这个问题会神奇地消失,我试着用这种方式声明一个浮点向量:std::vector vec(size);但它不起作用。有没有办法声明一个在运行时确定大小的向量?@jazzybazz:Vectors本质上是动态的。你不必给他们一个尺码。但是,如果您想给一个初始大小,请使用构造函数初始值设定项。例如,
Foo::Foo():solution(size){…}
。可能是三的规则。您使用了
Foo
s的向量。为什么不使用
float
s的向量呢?我打赌这个问题会神奇地消失,我试着用这种方式声明一个浮点向量:std::vector vec(size);但它不起作用。有没有办法声明一个在运行时确定大小的向量?@jazzybazz:Vectors本质上是动态的。你不必给他们一个尺码。但是,如果您想给一个初始大小,请使用构造函数初始值设定项。例如,
Foo::Foo():solution(size){…}
。谢谢,我想我会去掉动态数组,改用浮点向量。@jazzybazz这可能是最简单的解决方案谢谢,我想我会去掉动态数组,改用浮点向量。@jazzybazz这可能是最简单的解决方案
class Foo;
class Bar {
 std::vector<Foo> vec;
};
Foo::Foo() {
  solution = new float[size];
  // some function that initializes the elements of solution
}