找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1036|回复: 2

[求助]析构函数莫名其妙总出错

[复制链接]
发表于 2009-11-2 02:11:48 | 显示全部楼层 |阅读模式 IP:江苏扬州
程序清单如下:
----------------------Matrix.h----------------------------------

#include <iostream>
#include <fstream>
#include <math.h>
#include <stdexcept>
#include <memory.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
#ifndef _MATRIX_H_
#define _MATRIX_H_
///////////////////////////////////////////
// Declaration of Class Matrix //
///////////////////////////////////////////
class Matrix
{
protected:
double* m_data;
unsigned int m_row;
unsigned int m_col;
unsigned long int m_length;
public:
Matrix();
Matrix(unsigned int row, unsigned int col, double* pdata);
Matrix(Matrix &mat);
~Matrix();
inline unsigned int GetRow(void) { return m_row; };
inline unsigned int GetCol(void) { return m_col; };
inline unsigned long int GetLength(void) { return m_length; };
inline double GetData(unsigned long int pos)
{
return m_data[pos-1];
};

bool IsEmpty(void);
bool Reset(Matrix &mtr);
};
#endif

----------------------Matrix.cpp--------------------------------

#include "Matrix.h"
///////////////////////////////////////////
// Constructor & Destructor //
///////////////////////////////////////////
Matrix::Matrix()
{
m_row = 0;
m_col = 0;
m_length = 0;
m_data = NULL;
}
Matrix::Matrix(unsigned int row, unsigned int col, double* pdata)
{
m_row = row;
m_col = col;
m_length = (unsigned long int)(row * col);

m_data = new double[m_length];
try
{
if (m_data == NULL)
{
throw out_of_range("In constructor of Matrix(unsigned, unsigned, Dot*). Out of memory.");
}
if (pdata == NULL)
{
throw runtime_error("In constructor of Matrix(unsigned, unsigned, Dot*). Pointer is NULL.");
}
unsigned long int i;
for (i=0; i<m_length; i++)
{
m_data[i] = pdata[i];
}
}
catch (out_of_range &err)
{
std::cerr << err.what() << endl;
m_row = 0;
m_col = 0;
m_length = 0;
}
catch (runtime_error &err)
{
std::cerr << err.what() << endl;
m_row = 0;
m_col = 0;
m_length = 0;
}
}
Matrix::~Matrix(void)
{
if (m_data != NULL)
{
delete [] m_data;
}
}
///////////////////////////////////////////
// Member Function //
///////////////////////////////////////////
bool Matrix::IsEmpty(void)
{
if (m_length == 0)
{
return true;
}
else
{
return false;
}
}

bool Matrix::Reset(Matrix &mat)
{
if (!IsEmpty())
{
delete [] m_data;
m_data = NULL;
m_row = 0;
m_col = 0;
m_length = 0;
}

if (!mat.IsEmpty())
{
m_data = new double[m_length];
if (m_data == NULL)
{
return false;
}
else
{
m_row = mat.GetRow();
m_col = mat.GetCol();
m_length = mat.GetLength();
unsigned int long i;
for (i=0; i<m_length; i++)
{
m_data[i] = mat.GetData(i+1);
}
}
}

return true;
}

----------------------Main.cpp----------------------------------

#include "Matrix.h"
double testdata[] = { 1, 2,
1, 3 };
unsigned int row = 2, col = 2;
void main(void)
{
Matrix mtr;
mtr.Reset(Matrix(row, col, testdata));
}

发生问题描述:每次从Reset退出后,发生Matrix(row, col, testdata)构造的局部变量的解析时,在解析函数delete掉申请资源时,就会出错。实在不知道是怎么个问题,请高手指教,谢谢。

错误显示为:
Debug Assertion Failed!
发表于 2009-11-2 02:11:49 | 显示全部楼层 IP:江苏扬州
Reset中  m_data = new double[m_length]; 这个应该是mat.m_length吧
回复

使用道具 举报

发表于 2009-11-2 02:11:52 | 显示全部楼层 IP:江苏扬州
哎呀……不好意思。居然出了这种问题……
感谢2楼maoguoqing指点!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 23:36 , Processed in 0.203518 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表