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中运行这个程序时,会抛出一个异常,直到最后都没有运行。有人向我解释为什么会这样吗?这段代码也正确吗?
答案 0 :(得分:5)
您正尝试多次指向局部变量地址的delete
指针,因为您要删除的指针将指向main中的five
或val
中的setToNull
{1}}。这些变量位于堆栈中,当它们超出范围时将自动删除。如果你手动delete
他们,你会得到未定义的行为,除其他外,这会导致崩溃。
答案 1 :(得分:2)
您正在尝试删除未在堆上分配的指针,指针指向堆栈上的元素
int*ptr = &five
您不能删除在堆栈上分配的指针。 new
分配只应由delete
还有一件事是你在源代码中删除了int *ptr
两次。一次在delete tempPtr;
,第二次在delete ptr;
这将导致双重删除该指针(在此特定代码中将其设置为空指针),您必须检查天气是否可以安全删除指针删除它。
答案 2 :(得分:1)
首先要注意的是,在setToNull
中,您完全忽略传入的指针值(您立即将本地int val
的地址指定给tempPtr
),所以无论您在此处做什么函数对main
中的任何内容都没有影响(因为你还按值传递了指针)。
现在看看你在setToNull
中做了什么:
int val = 25;
tempPtr = &val;
delete tempPtr;
您创建了具有自动存储持续时间的本地int
,val
(即“在堆栈上”) - 您没有使用new
为其分配内存。然后,您将其地址分配给tempPtr
,最后您尝试在其上调用delete
。由于您未使用val
为new
分配内存,因此这是未定义的行为,并且是您的异常的来源。
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
。