我有一个全局指针变量
char* pointer = new char[500];
/* some operations... */
有一个单独的FreeGlobal()函数可以释放指针,如下所示:
delete[] pointer;
第一次调用函数时,它实际上释放了内存,现在指针是一个坏指针。但是当我们不止一次调用它时,它会引发异常。
有没有办法在再次调用delete []之前检查指针变量?有什么工作?这是一种不好的做法吗?
谢谢。
答案 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;
}