【发布时间】: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<Frame>?那你为什么不使用初始化列表呢?以及为什么要在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