Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除全局ptr_C++ - Fatal编程技术网

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++
),您可能会发现它有趣且有用。Take

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++
),您可能会发现它有趣且有用。以

为例,删除指针(全局指针或其他指针)本身不会导致内存泄漏。但是,有一些实例可能会导致内存泄漏。值得注意的是,在指向未分配相应新表达式的内存的指针上调用delete表达式会导致未定义的行为(例如,内存泄漏),这应该始终避免

在一些编译器上

int * p = new int[30];

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

delete表达式最终可能只释放相当于一个int的内存

在任何情况下,删除指针(全局指针或其他指针)本身都不会导致内存泄漏。但是,有一些实例可能会导致内存泄漏。值得注意的是,在指向未分配相应新表达式的内存的指针上调用delete表达式会导致未定义的行为(例如,内存泄漏),这应该始终避免

在一些编译器上

int * p = new int[30];

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

delete表达式最终可能只释放相当于一个int的内存应该改为使用。

我认为你的答案也可以是“是的,最终”:)我认为这是一种非常好的(尽管很难)了解内存泄漏的方法practice@davka-你是说通过无用的指针来释放内存的内存泄漏?@Dennis:不,你是对的,我应该纠正我自己。这不会导致内存泄漏,但当从程序的其他部分访问时,可能会导致分段错误或内存损坏,如本答案中所述。当然,您可以(也应该)在
delete
之后将指针设置为0,但这种设计通常是非常错误的-prone@davka:来自维基百科…“计算机科学中的内存泄漏(或泄漏,