删除[] char *,内存问题

时间:2009-09-11 01:39:07

标签: c++

我有一个全局指针变量

char* pointer = new char[500];
/* some operations... */

有一个单独的FreeGlobal()函数可以释放指针,如下所示:

delete[] pointer;

第一次调用函数时,它实际上释放了内存,现在指针是一个坏指针。但是当我们不止一次调用它时,它会引发异常。

有没有办法在再次调用delete []之前检查指针变量?有什么工作?这是一种不好的做法吗?

谢谢。

7 个答案:

答案 0 :(得分:15)

删除指针后将其设置为null。您不应该尝试多次删除相同的数据。

正如GRB在此帖子的评论中所提到的,致电delete[] NULL是完全安全的。

答案 1 :(得分:5)

我建议你实际修复你的代码。双重删除是一件可怕的事情。

,而不是让hackish例程让这件事发生,解决真正的问题:不再双重删除。

找出你为什么要删除两次,并阻止它发生。如果您不使用全局变量,这可能会更容易。如果您需要全局资源,请使用单例。

此外,使用std::vector<char>boost::array<char, 100>,因此您无需担心内存问题。如果您不必担心(或访问)删除它,则不能意外删除两次。

答案 2 :(得分:3)

错误指针上的

delete会导致未定义的行为。你很幸运它抛出了异常,但你当然不应该依赖于这种情况。要防止它,只需在delete之后将指针设置为0即可。 delete空指针是安全的(如果FreeGlobal()被多次调用),所以你不必进行任何if-test。

void FreeGlobal()
{
    delete [] pointer;
    pointer = 0;
}

答案 3 :(得分:3)

在调用delete或delete []之前,不需要检查指针是否为null。你的功能应如下所示:

void freeGlobal(char*& ptr) {
    delete[] ptr;
    ptr = 0;
}

我想知道的是为什么这个东西是全局的而不是在课堂内?

class buffer {
    char* buf;
    size_t size;
public:
    buffer(size_t n) : size(n), buf(new char[size]) {}
    ~buffer() { delete[] buf; buf = 0; }

    operator char*() { return buf; }
    char& operator[](size_t ofs) {
        assert(ofs >= 0 && ofs < size);
        return buf[ofs];
    }
};

我的实现可能有些问题,因为我只是在这里输入。另一个问题是你为什么不使用std :: string作为这个char缓冲区?

答案 4 :(得分:1)

你的freeGlobal()函数应该指向0,所以定义函数:

//if ptr is not null, delete; otherwise, return
void freeGlobal(char*& ptr)
{
   if (ptr != 0)
   {
      delete[] ptr;
      ptr = 0;
   }
}

编辑:0 == NULL,至少目前为止,在C ++中。

答案 5 :(得分:1)

CERT Coding Standard Site处查看此链接。释放变量后,您应该将指针设置回NULL,因为它不再指向任何东西。

答案 6 :(得分:0)

指向无处的指针应该指向无处。 pointer = null;

if (pointer != null) {
delete[] pointer;
pointer = null;
}