删除全局ptr

时间:2011-02-24 11:19:46

标签: c++

您好 只是想知道我是否删除了全局ptr,这会导致内存泄漏

5 个答案:

答案 0 :(得分:6)

不,但是如果有其他指向您删除的对象,它可能会导致悬空指针。内存泄漏是指没有指向已分配对象的指针,因此删除指针不会导致内存泄漏。

答案 1 :(得分:0)

不,但它很容易导致悬挂指针。

如果你的指针是全局的,它应该只是坚持到执行结束。

答案 2 :(得分:0)

删除全局指针不会导致内存泄漏,但会使指向同一内存的其他指针无效(使它们“悬空”)。

char* g_p = new char[10]; 

void foo()
{
    delete[] g_p;
    g_p = 0; 
}

int main()
{
   char* p = g_p;
   foo();            
   // p still points to memory that has been deallocated 
   char ch = *p; // using dangling pointer - undefined behaviour
   return 0;
}

编辑前我的(不正确)示例(我已经离开了,所以发布的评论很有意义):

删除全局指针的一种典型情况可能导致内存泄漏:

char* g_p = new char[10]; // allocate memory block 1

void foo()
{
   char* p = new char[10]; // allocate memory block 2
   g_p = p;
}

int main()
{
   foo();
   delete[] g_p; // free memory block 2
   return 0;
   // memory leak: memory block 1 has not been deallocated
}

全局指针已在foo中分配了另一个值,因此我们丢失了内存块1的轨道 - 没有变量保留其起始地址,因此我们无法释放它。很难跟踪改变全局变量的人和时间,这是应该避免的原因之一。

答案 3 :(得分:0)

delete - int全局指针值不会导致内存泄漏,但可能会导致别名悬空指针。

想象

int * ptr;

int main()
{
     ptr = new int;
     int * alias = ptr;
     delete ptr;
     *alias = 5; // Undefined Behaviour
     return 0;
}

现在使用此内存位置将导致未定义的行为。 当两个指针“指向”同一位置时,这种情况称为Aliased Pointer

以更好的方式设计系统并尝试不使用全局变量应该更好。但是,即使在本地函数体中也可能存在同样的问题。

另外,应该注意的是,程序开始执行时ptr会自动初始化为0(其存储类的原因),因此如果您尝试执行delete ptr你的程序的第一行不会发生任何坏事(是的,全局变量在执行main()之前初始化)。

在1-2天前有一个某种方式可能是相关的,我认为(因为它是C++)你可能会发现它有趣且有帮助。拿a look

答案 4 :(得分:0)

没有一个实例删除指针(全局或其他)肯定会导致内存泄漏本身。但是,有一些情况可能导致内存泄漏。值得注意的是,在未使用相应的new-expression分配的内存指针上调用delete-expression会导致未定义的行为(例如,内存泄漏),应始终避免这种行为。

在某些编译器上,

int * p = new int[30];

int main()
{
  delete p; // undefined behavior
}

delete-expression最终可能只释放相当于一个int的内存。由于p指向数组,因此应该使用delete[] p;