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 中的fivesetToNull 中的val。这些变量位于堆栈中,当它们超出范围时将自动删除。如果您手动 delete 它们,您将获得未定义的行为,其中可能会导致崩溃。

【讨论】:

【参考方案2】:

您正在尝试删除未在堆上分配的指针,您的指针指向堆栈上的元素

int*ptr = &amp;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;

您创建了一个本地 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

【讨论】:

以上是关于C++ 指针 - Visual Studio 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

C++ Visual Studio 2015“非标准语法;使用 '&' 创建指向成员的指针”

C++ 指针使用 Visual Studio 更改地址,而不是使用 OsX 中的 Xcode 或 Linux 中的 gcc

Python 3,如何设置 Visual Studio C++ 2015 编译器?

C++ 项目在 Visual Studio 2019 中触发了断点

C++ Visual Studio 运行时错误

在 Visual Studio 2012 中编译启用 CLR 的 C++ 项目时出现 C2248 错误