C++ 删除全局ptr
嗨C++ 删除全局ptr,c++,C++,嗨 只是想知道如果我删除一个全局ptr,这会导致内存泄漏吗?不,但是如果有其他指向你删除的对象的指针,它会导致指针悬空。内存泄漏是指您没有指向已分配对象的指针,因此删除指针本身不会导致内存泄漏。否,但如果有指向您删除的对象的其他指针,则可能导致指针悬空。内存泄漏是指没有指向已分配对象的指针,因此删除指针本身不会导致内存泄漏。否,但很容易导致指针挂起 如果您的指针是全局指针,它可能会一直停留到执行结束 没有,但这很容易导致指针悬空 如果您的指针是全局指针,它可能会一直停留到执行结束 删除全局指针不
只是想知道如果我删除一个全局ptr,这会导致内存泄漏吗?不,但是如果有其他指向你删除的对象的指针,它会导致指针悬空。内存泄漏是指您没有指向已分配对象的指针,因此删除指针本身不会导致内存泄漏。否,但如果有指向您删除的对象的其他指针,则可能导致指针悬空。内存泄漏是指没有指向已分配对象的指针,因此删除指针本身不会导致内存泄漏。否,但很容易导致指针挂起
如果您的指针是全局指针,它可能会一直停留到执行结束 没有,但这很容易导致指针悬空
如果您的指针是全局指针,它可能会一直停留到执行结束 删除全局指针不会导致内存泄漏,但会使指向同一内存的其他指针无效(使它们“悬空”) 编辑前我的(不正确的)示例(我留下了它,因此发布的评论有意义): 删除全局指针时的一种典型情况可能导致内存泄漏:
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的轨迹-没有保持其起始地址的变量,因此我们无法释放它。跟踪谁以及何时更改全局变量是非常困难的,这也是应该避免更改全局变量的原因之一。删除全局指针不会导致内存泄漏,但会使指向同一内存的其他指针失效(使它们“悬空”)
编辑前我的(不正确的)示例(我留下了它,因此发布的评论有意义):
删除全局指针时的一种典型情况可能导致内存泄漏:
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的轨迹-没有保持其起始地址的变量,因此我们无法释放它。很难跟踪谁以及何时更改全局变量,这是应该避免更改全局变量的原因之一。delete
-int全局指针值不会导致内存泄漏,但可能会导致别名悬空指针
想象
int * ptr;
int main()
{
ptr = new int;
int * alias = ptr;
delete ptr;
*alias = 5; // Undefined Behaviour
return 0;
}
现在使用此内存位置将导致未定义的行为。
当两个指针“指向”同一位置时,这种情况称为
最好以更好的方式设计系统,尽量不使用全局变量。然而,即使在局部函数体中,同样的问题也可能存在
此外,还应注意,当程序开始执行时,ptr
会自动初始化为0
(其存储类的原因),因此,如果您尝试在程序的第一行执行delete ptr
,则不会发生任何错误(是的,在执行main()之前初始化全局变量)
开始)
1-2天前,有一篇可能与此相关的帖子,我认为(因为它是
C++
),您可能会发现它有趣且有用。Takedelete
-int全局指针值不会导致内存泄漏,但可能会导致别名悬空指针
想象
int * ptr;
int main()
{
ptr = new int;
int * alias = ptr;
delete ptr;
*alias = 5; // Undefined Behaviour
return 0;
}
现在使用此内存位置将导致未定义的行为。
当两个指针“指向”同一位置时,这种情况称为
最好以更好的方式设计系统,尽量不使用全局变量。然而,即使在局部函数体中,同样的问题也可能存在
此外,还应注意,当程序开始执行时,ptr
会自动初始化为0
(其存储类的原因),因此,如果您尝试在程序的第一行执行delete ptr
,则不会发生任何错误(是的,在执行main()之前初始化全局变量)
开始)
1-2天前,有一篇可能与此相关的帖子,我认为(因为它是
C++
),您可能会发现它有趣且有用。以为例,删除指针(全局指针或其他指针)本身不会导致内存泄漏。但是,有一些实例可能会导致内存泄漏。值得注意的是,在指向未分配相应新表达式的内存的指针上调用delete表达式会导致未定义的行为(例如,内存泄漏),这应该始终避免
在一些编译器上
int * p = new int[30];
int main()
{
delete p; // undefined behavior
}
delete表达式最终可能只释放相当于一个int的内存应该改为使用code>。在任何情况下,删除指针(全局指针或其他指针)本身都不会导致内存泄漏。但是,有一些实例可能会导致内存泄漏。值得注意的是,在指向未分配相应新表达式的内存的指针上调用delete表达式会导致未定义的行为(例如,内存泄漏),这应该始终避免 在一些编译器上
int * p = new int[30];
int main()
{
delete p; // undefined behavior
}
delete表达式最终可能只释放相当于一个int的内存应该改为使用。我认为你的答案也可以是“是的,最终”:)我认为这是一种非常好的(尽管很难)了解内存泄漏的方法practice@davka-你是说通过无用的指针来释放内存的内存泄漏?@Dennis:不,你是对的,我应该纠正我自己。这不会导致内存泄漏,但当从程序的其他部分访问时,可能会导致分段错误或内存损坏,如本答案中所述。当然,您可以(也应该)在
delete
之后将指针设置为0,但这种设计通常是非常错误的-prone@davka:来自维基百科…“计算机科学中的内存泄漏(或泄漏,