C++指针 - Visual Studio 引发异常
C++ pointers - visual studio throws exception
void setToNull(int *tempPtr)
{
int val = 25;
tempPtr = &val;
std::cout << "hh" << std::endl;
std::cout << *tempPtr << std::endl;
delete tempPtr;
tempPtr = nullptr;
}
int main()
{
int five = 5;
int *ptr = &five;
std::cout << *ptr;
setToNull(ptr);
if (ptr)
std::cout << *ptr;
else
std::cout << " ptr is null" << std::endl;
delete ptr;
ptr=nullptr;
return 0;
}
当我在Visual Studio中运行此程序时,会抛出异常,并且直到结束才运行。谁能向我解释为什么会发生这种情况?还有这个代码正确吗?
您正在尝试多次delete
指向局部变量地址的指针,因为您要删除的指针要么指向 main 中的five
,要么指向 setToNull
中的val
。这些变量位于堆栈中,当它们超出范围时将自动删除。如果您手动delete
它们,您将获得未定义的行为,除其他外,这可能会导致崩溃。
您正在尝试删除未在堆上分配的指针,您的指针指向堆栈上的元素
int*ptr = &five
不得删除在堆栈上分配的指针。按new
分配只能按delete
删除
还有一件事,您将在源代码中两次删除int *ptr
。一次在 delete tempPtr;
处,第二次在 delete ptr;
这将导致该指针的双重删除(在此特定代码中,您将其设置为 null 指针(,您必须检查天气是否安全删除您的指针,然后再删除它。
要注意的是,在setToNull
中,您完全忽略传入的指针值(您立即将本地int val
的地址分配给tempPtr
(,因此您在此函数中执行的任何操作都不会对main
中的任何内容产生影响(因为您还按值传递了指针(。
所以现在看看你在setToNull
中做了什么:
int val = 25;
tempPtr = &val;
delete tempPtr;
您创建了一个具有自动存储持续时间(即"在堆栈上"(的本地int
val
- 您没有使用 new
为其分配内存。然后你把它的地址分配给tempPtr
,最后你尝试调用delete
。由于您没有使用 new
为val
分配内存,因此这是未定义的行为,并且是异常的来源。
那main
呢?好吧,您正在尝试再次做完全相同的事情,这次是five
:
int five = 5;
int *ptr = &five;
setToNull(ptr); // does nothing to ptr or the memory it references
delete ptr; // you didn't use new, so delete is undefined behaviour
黄金法则:如果你不使用new
,就不要使用delete
。
- 抛出的 Visual Studio 异常:写入访问冲突。q_deck->p_deck 0x110112。C 语言
- Visual Studio图形调试器引发读取访问冲突异常
- WinDBG适用于从Visual Studio 2015保存的转储,但不适用于任务管理器。显示异常代码"not found"
- 异常错误C++ //Visual Studio
- cv:内存位置的异常 - 运行 openCV 代码 Visual Studio 2013 & Visual Studio 2017 - Windows 7
- 在Visual Studio 2017中使用stoi()的异常未递
- Visual Studio 2017 中未捕获的 C++ 异常
- 切片std :: out_of_range to std ::异常在Visual Studio vs G 中
- 如何在Visual Studio(2015)中增加堆栈尺寸的堆栈尺寸?异常代码:C00000FD
- 在Visual Studio Community中使用glfw3 glew和opengl获取访问冲突异常
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"
- CloseHandle 在 STDOUT 重定向后在 Studio 2010 中引发异常
- 在Visual Studio 2010 c ++中调试时出现奇怪的异常
- 在Visual Studio C 调试模式中捕获异常的最佳方法仅在从IDE运行时才会发生
- Visual Studio检查了迭代器不抛出异常
- Visual studio显示SEH异常的错误位置
- Visual Studio 调试继续未处理的异常
- 在MS Visual Studio 2010上使用带有Cuda互操作的OpenGL缓冲区时出现异常错误
- 升级Visual Studio后Fortran DLL出现异常
- 删除二叉搜索树中的节点中的 Visual Studio 中的访问冲突异常