我正在尝试创建一个结构向量,每个结构都有一个指针数组。但是,我似乎无法删除没有内存问题的向量。
当我运行valgrind时
== 29801 ==无效的free()/ delete / delete [] / realloc() == 29801 ==在0x4A05A36:运算符删除(vg_replace_malloc.c:515) == 29801 == by 0x4009D4:test_struct :: ~test_struct()(在/home/hltcoe/rcotterell/code-switching/a.out中) == 29801 == by 0x40142B:void std :: _ Destroy(test_struct *)(in /home/hltcoe/rcotterell/code-switching/a.out) == 29801 == by 0x401299:void std :: _ Destroy_aux :: __ destroy(test_struct *, test_struct *)(在/home/hltcoe/rcotterell/code-switching/a.out中)
修改
#include <vector>
using namespace std;
struct test_struct {
public:
int * array;
test_struct() {
array = NULL;
}
~test_struct() {
delete[] array;
}
private:
test_struct(const test_struct& that);
test_struct& operator=(const test_struct& that);
};
int main(int argc, char ** argv) {
vector <test_struct> data;
for (int i = 0; i < 5; ++i) {
test_struct tmp;
tmp.array = new int[5];
data.push_back(tmp);
}
}
它给出了以下编译错误。有什么想法吗?
答案 0 :(得分:3)
您应该尽可能遵循rule of three或使用STL容器:
struct test_struct
{
explicit test_struct(int size) : array(size) { }
std::vector<int> array;
};
int main()
{
vector <test_struct> data(5, test_struct(5));
return 0;
}
答案 1 :(得分:2)
由于test_struct
析构函数以及您尝试将结构存储在vector
中,因此您的解决方案无效。
将test_struct tmp
推送到向量时,会创建test_struct
的副本。然后调用tmp
销毁delete[] array
,vector <test_struct> data
中的副本会以悬空指针结束。
您可能需要重新考虑您的体系结构,或者至少为复制整个数组的test_struct
添加一个复制构造函数