当条件太高时,带有类函数的循环错误

时间:2014-04-05 15:42:40

标签: c++ class for-loop segmentation-fault

上次我经常遇到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 ++或类似内容的小知识。

提前致谢。

4 个答案:

答案 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,您也应该收到错误