C++ 指针 - Visual Studio 抛出异常
Posted
技术标签:
【中文标题】C++ 指针 - Visual Studio 抛出异常【英文标题】:C++ pointers - visual studio throws exception 【发布时间】:2015-10-28 11:30:13 【问题描述】: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
指向堆栈上的某个内容的指针。当您使用new
进行分配时,您只需要delete
--- 不,代码不 正确。
【参考方案1】:
您正在尝试多次指向指向局部变量地址的delete
指针,因为您要删除的指针将指向main 中的five
或setToNull
中的val
。这些变量位于堆栈中,当它们超出范围时将自动删除。如果您手动 delete
它们,您将获得未定义的行为,其中可能会导致崩溃。
【讨论】:
【参考方案2】:您正在尝试删除未在堆上分配的指针,您的指针指向堆栈上的元素
int*ptr = &five
您不能删除分配在堆栈上的指针。 new
分配的只能被delete
删除
还有一件事,您将在源代码中两次删除int *ptr
。一次在delete tempPtr;
和第二次在delete ptr;
这将导致该指针的双重删除(在此特定代码中,您将其设置为空指针),您必须检查天气是否可以安全地在删除指针之前删除它。
【讨论】:
不,这部分逻辑上没问题,因为在调用setToNull
之后ptr
应该是nullptr
,删除nullptr
是没用的,但合法。
@SingerOfTheFall:除了 ptr
是按值传递的,而不是按引用传递,因此不设置为 nullptr
。确实是双重删除,但是这个问题中的建议(检查有效性)是错误的。您无法检查指针的“有效性”。你必须知道删除它是否安全。
@MSalters,我明白这一点,但我在谈论 OP 显然 打算 实现的目标,这就是为什么我说“逻辑上”很好,即它很好提供OP 不会在代码中犯任何错误。【参考方案3】:
首先要注意的是,在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
。
【讨论】:
以上是关于C++ 指针 - Visual Studio 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章
C++ Visual Studio 2015“非标准语法;使用 '&' 创建指向成员的指针”
C++ 指针使用 Visual Studio 更改地址,而不是使用 OsX 中的 Xcode 或 Linux 中的 gcc
Python 3,如何设置 Visual Studio C++ 2015 编译器?