您好 只是想知道我是否删除了全局ptr,这会导致内存泄漏
答案 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;
。