【问题标题】:"Pointer being freed was not allocated" while deleting allocated (?) pointer删除分配的(?)指针时“未分配被释放的指针”
【发布时间】:2020-09-25 09:15:46
【问题描述】:

错误发生在“删除指针;”

代码:

#include <iostream>

int main() {
    int i = 5;
    int* pointer = &i;
    *pointer = 0;
    std::cout << "Value: " << i << std::endl;
    delete pointer;
    std::cout << "This does not print" << std::endl;
    return 0;
}

输出:

Value: 0
untitled1(11320,0x106c20dc0) malloc: *** error for object 0x7ffeeeb00948: pointer being freed was not allocated
untitled1(11320,0x106c20dc0) malloc: *** set a breakpoint in malloc_error_break to debug

Process finished with exit code 6

操作系统:macOS Catalina 10.15.6 (19F101)

C++14

CMake:3.16.5(与 CLion 捆绑)

gcc -v 的输出:

❯ gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 11.0.3 (clang-1103.0.32.29)
Target: x86_64-apple-darwin19.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

【问题讨论】:

标签: c++ pointers c++14 clion


【解决方案1】:

你还没有分配任何指针。您也对术语感到困惑。这里的分配是指动态分配。在动态分配中,您分配 memory 并将该内存的地址分配给指针。内存分配new

所以你的代码的正确版本是

#include <iostream>

int main() {
    int* pointer = new int(5);
    *pointer = 0;
    std::cout << "Value: " << *pointer << std::endl;
    delete pointer;
    std::cout << "This does print" << std::endl;
    return 0;
}

当您使用new 分配内存时,您应该使用delete 释放它。否则你会得到所谓的内存泄漏。未经检查的内存泄漏最终将意味着您的程序耗尽了可分配的内存。

【讨论】:

  • 原始代码在我的机器上运行良好(?)。为什么在从现有变量创建指针时不应该使用delete? (使用 &)。我对这个指针的东西还是很陌生,所以我只是出于好奇而问。我认为即使指针指向现有变量也需要删除?
  • delete 只需要与new 一起使用(而delete[] 需要与new[] 一起使用)。不知道你从哪里得到所有指针都需要被删除的想法,那是完全错误的。请记住,要删除的是 memory 而不是指针。所以如果你有两个指针指向同一个动态分配的内存块,你只需要一个删除。记住内存被删除而不是指针,这是我之前提到的术语错误。
  • 您的代码在一台机器上运行而不在另一台机器上运行的原因是未定义的行为。糟糕的 C++ 程序不必崩溃或产生错误消息,它们所拥有的只是未定义的行为,这意味着当您运行它们时,任何事情都可能发生,包括“工作”。
  • 感谢您的解释!欣赏它。
【解决方案2】:

您应该只使用已分配newdelete 指针。当对象超出范围时,指向其他对象的指针将自动失效(有点像删除,但不完全),因此您不必担心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-30
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多