C++指针 - Visual Studio 引发异常

C++ pointers - visual studio throws exception

本文关键字:异常 Studio Visual 指针 C++      更新时间:2023-10-16
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。由于您没有使用 newval分配内存,因此这是未定义的行为,并且是异常的来源。

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