C ++指针 - visual studio抛出异常

时间:2015-10-28 11:30:14

标签: c++ visual-studio c++11 visual-c++

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中运行这个程序时,会抛出一个异常,直到最后都没有运行。有人向我解释为什么会这样吗?这段代码也正确吗?

3 个答案:

答案 0 :(得分:5)

您正尝试多次指向局部变量地址的delete指针,因为您要删除的指针将指向main中的fiveval中的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;

您创建了具有自动存储持续时间的本地intval(即“在堆栈上”) - 您没有使用new为其分配内存。然后,您将其地址分配给tempPtr,最后您尝试在其上调用delete。由于您未使用valnew分配内存,因此这是未定义的行为,并且是您的异常的来源。

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