【问题标题】:How exactly does dynamic memory work with CLion?动态内存如何与 CLion 一起工作?
【发布时间】:2019-01-05 23:01:43
【问题描述】:

我开始使用 Xcode,但后来决定使用 CLion。 我有这个类有一个指针char * buffer。构造函数如下所示:

example::example (char input[], unsigned long len) {
    buffer = new char[len];
    for (unsigned long i = 0; i < len; i++) {
        buffer[i] = input[i];
    }
    length = len;
}

析构函数基本上就是delete[] buffer

在 Xcode 上运行时没有问题,但是在同一台机器上的 CLion 上运行相同的代码时,我收到以下消息:

Project(77633,0x7fffb5cb7340) malloc: *** error for object 0x7f8a35400350: pointer being freed was not allocated

*** set a breakpoint in malloc_error_break to debug
Process finished with exit code 6

虽然代码运行了,但我仍然觉得它很奇怪,调试后我发现它来自我班级的析构函数。如果我注释掉 delete[] buffer 部分,消息就会消失。

所以现在我很困惑,我认为您应该始终删除您使用 new 分配的内存。不是这样吗?

【问题讨论】:

  • 很可能,您的buffer 成员已经被删除(您是否遵循“三规则”?)或已被代码中的其他内容损坏。您还可以使用已不复存在的 example 实例。
  • 不,我错过了复制构造函数,就是这样!我将类的一个实例作为参数传递到其他地方。实现复制构造函数解决了这个问题。 +1 为您的帮助我的朋友。
  • 您应该添加您的评论作为答案,这样它才能被投票为正确。

标签: c++ xcode memory-management clion


【解决方案1】:

首先,CLion 和 Xcode 都不是编译器。 在后台,他们运行一些可配置的编译器。 很可能是带有一些编译标志的某个版本的 gcc 或 clang 这也是可配置的。所以首先要确定是哪个编译器 正在每个环境中使用。那么回答这个问题会更容易。 当然,始终需要一个最小的完整且可验证的示例。 顺便问一下,你确定 len 不是 0 吗?当一个人试图分配 0 个字节时,就会发生不好的事情......

【讨论】:

  • 在 0 len 值上表现良好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 2016-02-05
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多