当我在循环中使用动态分配的对象指针时,教程、搜索和我的 C++ 正规教育的模糊记忆让我不知道应该在哪里使用 delete,例如:
// necessary files are included, this code is within main
T * t;
t = foo.getNewT();
while (!t->isFinalT()) {
// print t stuff
delete t; // is this where I should delete t?
t = foo.getNewT();
}
delete t;
在最近的一个课堂项目中,这种缺乏知识变得特别麻烦。在我的笔记本电脑(Linux Mint,g++ Ubuntu/Linaro 4.7.3-1ubuntu1)上,代码在没有删除语句的情况下运行良好,并且在我添加删除语句时崩溃。在学校服务器(Solaris,g++(GCC)3.4.5)上,代码在没有删除语句的情况下经过几次迭代后出现段错误,并且在我添加删除语句时运行良好。
如何正确处理这种循环,以便它可以在大多数环境中运行?
附加信息:当程序到达删除请求时,我的笔记本电脑上出现错误:
*** Error in 'program': free(): invalid next size (fast):
...
其他一些代码:
// T.h
class T {
int id;
int num;
int strVarPos;
char * strVar;
public:
T();
~T();
// + misc. methods
}
// T.cpp
T::T() {
id = 0;
num = -1;
strVarPos = 0;
char * strVar = new char[11];
strVar[0] = '\0'
}
T::~T() {
delete [] strVar;
}
// Foo.cpp
T * Foo::getNewT() {
T * t = new T;
// populate T's fields
return t;
}
解析度:
因为使用 just 和循环的简单测试可以T * t
正常工作,所以我最终从空白开始重建项目并一次添加一个类,以查看问题何时出现。结果是我在程序的其他地方添加了额外的内容到动态分配的数组中,而没有更新我用来初始化数组的大小常量。
显然,如果我确保正确删除指针(程序运行时间不够长,导致我的测试中出现严重的内存泄漏),学校服务器只能处理由此产生的内存差异而不会崩溃,而我的笔记本电脑不会注意到内存差异,直到我尝试调用删除(然后会崩溃)。