上次我经常遇到for循环错误。
最简单的展示方式是:
#include <iostream>
class Class
{
private:
int number;
public:
Class(int a);
void get();
};
Class::Class(int a)
{
number=a;
}
void Class::get()
{
std::cout<<number<<std::endl;
}
int main()
{
int amount=4;
Class* p[amount];
for(int i=0;i<amount;i++)
{
delete p[i];
p[i]=new Class(i);
}
for(int i=0;i<amount;i++)
{
p[i]->get();
}
return 0;
}
程序返回255,而在调试时我得到一个SIGSEGV信号 - 分段错误。
我发现有一件事很奇怪:当amount=3
或更少的程序正常工作时。我将使用它超过700个元素,所以我发现这非常令人失望。
我正在使用Windows 7和Code :: Blocks 13.12与GNU GCC编译器。
我应该在此程序中更改哪些内容才能正常运行?我很确定这只是关于c ++或类似内容的小知识。
提前致谢。
答案 0 :(得分:2)
Class* p[amount];
for(int i=0;i<amount;i++)
{
delete p[i];
p[i]=new Class(i);
}
您应该删除行delete p[i];
,因为数组p
尚未初始化。
答案 1 :(得分:2)
您始终在不指向动态分配对象的指针上调用delete
:
Class* p[amount]; // array of uninitialized pointers
delete p[i]; // oops
答案 2 :(得分:1)
以下是(见评论):
// This allocates `amount` spots for pointers
Class* p[amount];
// Your pointers are not initialized yet
for(int i=0;i<amount;i++)
{
// You are trying to delete what they point to
delete p[i]; // <<== This is undefined behavior
p[i]=new Class(i);
}
在分配要删除的对象之前,不应该调用delete
。否则,它是未定义的行为,即您的程序可能会崩溃。
最后,您需要在完成指针后删除指针以避免内存泄漏。您可以使用智能指针向量(推荐),或者只是在程序中添加另一个循环,如下所示:
int amount=4;
Class* p[amount];
for(int i=0;i<amount;i++)
{
p[i]=new Class(i);
}
for(int i=0;i<amount;i++)
{
p[i]->get();
}
for(int i=0;i<amount;i++)
{
delete p[i];
}
答案 3 :(得分:0)
初始化p [i]和声明。 Class * p [3] = {0};删除已内置null检查,因此您不会收到任何错误
即使金额为3或小于3,您也应该收到错误