返回首页

您好大家。
对不起,如果我的疑问是微不足道的,但我无法弄清楚如何解决它。
我有一个类,我分配在构造这样一个二维数组:


int i;

this->matrix = new double*[5];

for(i = 0 ; i < 5; i++)

    this->matrix[i]=new double[5];


和我在析构函数删除这样的二维数组。

{C}
有些时候,我有一个堆腐败,我发现,这发生在析构。我不知道如果二维数组分配是错误的,或者是破坏,这是错误的。
注:这是可能的,在我的计划中,我与1000个元素和程序分配一个数组工作得很好,和内存错误有时会给我吗?若有,是什么原因导致了这个错误?由操作系统的内存管理?

任何人都可以帮助我吗?
由于提前,菲利佩

回答

评论会员:游客 时间:2012/02/05
:嗨,请参阅下面的imgsrc=http://www.orcode.com/img/ico/smiley_wink.gif{A}{A2}{A3的}]
格雷厄姆违反
评论会员:游客 时间:2012/02/05
在你的析构函数,codeprespanclass="code-keyword"if/span(spanclass="code-keyword"this/span->matrix!=NULL){/pre/code之前应该去和周围的循环-否则,你遍历的外部阵列的内容删除其成员,然后检查是否存在之前删除外部阵列​​。Stefan_Lang:1。你的类有多少建设者?你的职位意味着只有一个。如果你的构造是正确的,应该是以下的罚款;否则请检查您的其他构造,以确保它们使用相同的代码(或更好地,致电分配的功能相同)2。你传递出一个指针外的类矩阵或矩阵的行吗?如果是这样,确保呼叫者不尝试和delete[]这些指针!3。当您复制一个包含这个矩阵的类类型的对象,会发生什么?如果你不有一个拷贝构造-根据1。你可能不-那么编译器为您创建一个,只会复制,拷贝构造的矩阵的指针,而不是建立一个结构上的新副本,因为它应该堆!因此,当副本被销毁,矩阵将被释放,但在原始对象的指针将不会受到影响和破坏后你将再次尝试删除它,这会导致运行时错误。你应该提供一个自己的拷贝构造函数来代替。它需要做深拷贝,使您的数据,销毁的对象,不会影响原来矩阵对象需要注意的是一个拷贝构造函数可以调用你意识到这一点,Eimplicitely。克。当值函数传递一个对象,或作为返回值传递。另外,如果你存储在STL容器中的任何对象,他们可能会调用拷贝构造函数。4。解决方案3,关于析构函数的代码。我的赌注是3。{S0}
CPallini
评论会员:游客 时间:2012/02/05
你的分配/释放模式看起来不错。堆损坏可能是别的东西。[更新]我张贴的代码测试,没有任何问题。[/更新]:菲利普・马克斯
我不知道这一点,但我在我的代码中存在的问题找出
在它的某些部分,我有下:


的开始,我把第一个地址等于NULL,初始化数组,但里面的for循环,它不能创建第二个层面,因为地址是空的。
所以,我的意思是:

{的C4}