【问题标题】:Strange memory behaviour - C++奇怪的内存行为 - C++
【发布时间】:2017-02-22 13:15:46
【问题描述】:

我在看似简单的代码中遇到了一个非常奇怪的问题(出于调试目的,我现在将其简化为几乎这段代码):

class Buf {
   Frame ** frames;

   Buf(int a);
   int a;
   long b, c, d

}
Buf::Buf(int size){

   a = size;
   frames = new Frame*[size]; 

   for (int f = 0; f < size; ++f){
       frames[f] = new Frame;
   }

   b = c = d = 5; // (***)
}

Frame 类非常简单且小巧,我在其构造函数/析构函数中禁用了任何内存操作。

main我打电话:

Buf* buf =  new Buf(50);

偶尔它工作正常,但大多数时候它工作正常,直到 (***) 行,然后当我通过这一行时,正如我在调试器中看到的那样,*frame, frame[1]等变为等于 5 (!) 或我在作业中输入的任何其他数字。

如果我尝试从命令行运行它,它会告诉我内存访问错误。

正如我所说,我将我的程序简化为非常琐碎,仍然找不到错误。

任何建议/帮助都会很棒!

更新:

我将代码复制到另一台计算机(具有类似配置),但无法重现该问题。在原始计算机上,无论我是从 XCode 还是 Eclipse/命令行(代码的不同副本)运行项目,我都可以重现该问题。

【问题讨论】:

  • 三件事:为什么使用指向Frame的指针而不是std::vector&lt;Frame&gt;?那你为什么不使用初始化列表呢?以及为什么要在main 函数中动态分配Buf 对象?
  • 建议:如果您认为Frame 类与问题无关,请将其替换为int,添加main,您将获得MCVE,这将有很大帮助在诊断中。
  • 这太简单了,我们无法从该代码中重现错误。请发帖minimal reproducible example
  • 您的代码不完整;特别是,它似乎缺少一个main() 函数和至少一个#include。请edit您的代码,这是您的问题的minimal reproducible example,然后我们可以尝试重现并解决它。您还应该阅读How to Ask
  • @Erix std::vector 不只是任何旧库的一部分,它还是 标准 库的一部分。所有 C++ 编译器都附带它。它包含许多让每个 C++ 程序员的生活更轻松的东西,并使代码更易于阅读、理解和维护。如果我是一名教师,并且这是学校作业的一部分,而且它不是关于指针,那么我会给给我这个代码的人一个非常低的分数。

标签: c++ memory-management


【解决方案1】:
frames = new Frames*[size];

错了,“frames”变量被定义为指向Frame的指针,而不是指向Frames的指针。

【讨论】:

  • 是的,但非常不清楚这是否是实际问题。很可能不是因为那将是编译错误。我们应该等待那个 MCVE。
  • @BaummitAugen 确实很不清楚,但基于给出的最少代码量,似乎是一个明显的候选者。如果 Frames 不存在,将是编译错误;但是由于我们在这里使用指针而不是向量或安全指针,并且取决于使用的编译器及其设置,这可能“仅”是一个警告,但编译得很好。但是,如果 sizeof(Frames)
  • “但基于给出的代码量最少,似乎是一个明显的候选者。” 这就是为什么我建议我们等到问题处于可回答状态。
  • @Someprogrammerdude 声明中的 Frame**new[] 表达式中的 Frames*。注意额外的's'。一开始也误读了。
  • 另外,“如果 sizeof(Frames) :不是真的,我们需要sizeof(Frame*) != sizeof(Frames*)是一个问题,至少这是不常见的。
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 2015-09-22
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多