2 jan8705 jan8705 于 2013.06.14 23:46 提问

析构函数中使用delete报错

把析构函数里的delete去掉就不会报错了;但是搞不懂:我的构造函数里不是用了new吗,为什么会出现这种情况?
报错信息是:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),网上查了一下都说是重发调用delete的结果,但是我好像没有那么做。

//Matrix.h
class Matrix
{
public:
Matrix();
~Matrix();
Matrix(int,double*); //矩阵行列数、数组指针
Matrix operator+(const Matrix&);//矩阵相加
friend ostream& operator<<(ostream&,const Matrix&);//
private:
int n; //矩阵的行列数
double* pt;
};

//Matrix.cpp
Matrix::Matrix():pt(0)
{
n = 0;
}
Matrix::Matrix(int r,double* p): n(r)
{

pt = new double[r*r];
for(int i=0; i<r*r;i++)

pt[i] = p[i];

}
Matrix::~Matrix()
{
delete []pt;
pt = 0;
}
//矩阵相加函数实现
Matrix Matrix::operator+(const Matrix& m)
{
for(int i=0;i<n*n;i++)

pt[i] = pt[i] + m.pt[i];

return *this;
}
//矩阵输出函数的实现
ostream& operator<<(ostream& output,const Matrix& m)
{

for(int i=0;i<m.n*m.n;i++)

{

if((i+1)%m.n == 0)

output<<m.pt[i]<<endl;

else

output<<m.pt[i]<<" ";

}

return output;

}

然后就是main函数中
double *p1,*p2,x,y;
int n;

cout<<"请输两个矩阵的行列数(n*n):"<<endl<<"n=";
cin>>n;

cout<<"请输入第一个矩阵m1的元素:"<<endl;

p1=(double *)malloc(sizeof(double)*n*n);
for(int i=0;i<n*n;i++)      
{       
    cin>>x;     
    p1[i]=x;    
}

cout<<"请输入第二个矩阵m2的元素:"<<endl;
p2=(double*)malloc(n*n*sizeof(double));
for(int j=0;j<n*n;j++)  
{   
    cin>>y; 
    p2[j]=y;    
}   

Matrix m1(n,p1),m2(n,p2),M;
M=m1+m2;    
cout<<"m1+m2:"<<endl;   
cout<<M<<endl;
free(p1);
free(p2);
return 0;

2个回答

fanxu1986
fanxu1986   2015.01.21 21:12

缺少拷贝构造函数,对象引用时,拷贝构造出新的对象,而pt指向的申请空间都是同一片,最终你释放了两次,那么第二次必然就野了

tlxzsz
tlxzsz   2014.02.17 19:37

delete []pt;换成delete pt;试试。
因为pt不是一个数组、

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++自定义类的析构函数,生成指针对象:用delete删除时,产生错误:"fatal error LNK1120: 1 个无法解析的外部命令"
<br /><br />       在C++中,如果用户自定义了类的析构函数,会覆盖系统默认的析构函数。则对象在销毁时,会调用用户定义的类的析构函数,来释放内存。<br />       所以用户在定义类的析构函数时,如果没有在程序中实现,在使用类的指针对象是。用delete删除对象是会出现错误:“fatal error LNK1120: 1 个无法解析的外部命令”。<br />就是因为,用户定义的析构函数,而没有来实现。所以delete删除时,出现了这样的错误。<br />      总结:<br />
new、delete对调用 析构函数 的影响
#include using namespace std; class shape { public: shape() { cout << "ctor" ; } ~shape() { cout << "Dtor"; } }; int main() { shape a;//ctor,Dtor。 shape* b = new shape;/
【c++】析构函数中delete this指针
在析构函数中delete this指针,会产生什么样的结果呢? 先看看下面这段代码,想想运行结果。 #include using namespace std; class A { public: A() { cout<<"A()"<<endl; } ~A() { cout<<"~A()"<<endl; delete this; } }; int main() {
c++ 析构函数中的delete对象的顺序
今天用Qt编写程序的时候发现了一个问题,初始部分始源程序如下: #include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)/*, ui(new Ui::MainWindow)*/ { this->setMi
条款 6:析构函数里对指针成员调用 delete
大多数情况下,执行动态内存分配的的类都在构造函数里用 new 分配内存,然后在析构函数里用 delete 释放内存。最初写这个类的时候当然不难做,你会记得最后对在所有构造函数里分配了内存的所有成员使用 delete。         然而,这个类经过维护、升级后,情况就会变得困难了,因为对类的代码进行修改的程序员不一定就是最早写这个类的人。而增加一个指针成员意味着几乎都要进行下面的工作:  
C++ 析构函数以及 delete 和delete[]的整理
转自:http://hi.baidu.com/bystander1983/item/bf0b5c12b077cfec9913d651 delete和delete[] 的区别: C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 很多人注意到了这个问题,但是却不清楚为什么要这样做,
析构函数里对指针成员调用delete
大多数情况下,执行动态内存分配的的类都在构造函数里用new分配内存,然后在析构函数里用delete释放内存。最初写这个类的时候当然不难做,你会记得最后对在所有构造函数里分配了内存的所有成员使用delete。然而,这个类经过维护、升级后,情况就会变得困难了,因为对类的代码进行修改的程序员不一定就是最早写这个类的人。而增加一个指针成员意味着几乎都要进行下面的工作:    ·在每个构造函数里对指针进
在构造函数中使用new时应注意的事项、析构函数调用
使用new初始化对象的指针成员时必须特别小心。tu
内存泄漏-Delete不调用析构函数的两种情况
1. 所使用的类为预定义类 2. 转为父类,而父类没有声明virtual的虚析构函数
构造函数中调用构造函数new和delete使用小结
malloc free 是C语言的函数 new delete 是C++的操作符#include "iostream" using namespace std; //构造中调用构造是危险的行为 因为会生成匿名对象 匿名对象会消失 class MyTest { public: MyTest(int a, int b, int c) { this->a = a;