为什么使用删除会导致核心转储

  • 本文关键字:核心 转储 删除 c++
  • 更新时间 :
  • 英文 :


我目前正在使用Kubuntu 19.04 Kate 18.12.3和g++(Ubuntu 8.3.0-6ubuntu1(8.3.0 自学C++

在Kate的工具/模式/源菜单中,我选择C++或ISO C++。

我编写了一个小程序,其目的是修复上一个练习中出现的故意内存泄漏。这是我的密码。

/* Fix the program from Exercise 6. */
#include <iostream>
int myFunction(int * pInt);
int main()
{
int myVar;
int * pInt = new int;
pInt = &myVar;
*pInt = myFunction(&myVar);
std::cout << "The value of myVar is " << *pInt << std::endl;
delete pInt;   // Free up pointer.
pInt = 0;      // Make pointer safe.
return 0;
}
int myFunction(int * pInt)
{
*pInt = 2;
return *pInt;
}

当我通过g++传递此代码时,将生成以下输出。

myVar的值为2munmap_chunk((:无效指针中止(堆芯转储(

但是,当删除指令被注释掉时,会生成以下输出。

myVar的值为2

既然delete是C++中的一个标准关键字,为什么在这段代码中使用它会导致核心转储?

我无法理解这一点,如果能提供任何帮助,我将不胜感激。

致问候,

Stuart

在此语句中

pInt = &myVar;

您已经覆盖了new int返回的上一个值,并将其替换为指向局部变量的指针。这就是delete崩溃的原因(从技术上讲,这是未定义的行为(,因为运算符delete不能释放局部变量,只能释放分配给相应new运算符的内容。

重新分配指针后,将失去对new返回的指针的访问权限。这是内存泄漏。

最新更新