我目前正在使用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
返回的指针的访问权限。这是内存泄漏。