返回信息流#include "stdafx.h"
class Student
{
public:
Student()
{}
Student(int m , int n)
{
x = m;
y =n;
mPtr = new int[m *n];
}
~Student()
{
if(mPtr)
delete mPtr;
}
Student Add(Student stu)
{
Student s(stu.x,stu.y);
return s;
}
int x;
int y;
int* mPtr;
};
int _tmain(int argc, _TCHAR* argv[])
{
Student stu(10,10);
Student s(10,10);
s.Add(stu);
return 0;
}
构造函数new一个动态内存,
析构函数delete内存。
把析构函数的delete注释了就OK。
我的析构函数为什么不行??
delete为什么会有问题??
应该怎么改??
这是一条镜像帖。来源:北邮人论坛 / cpp / #41846同步于 2010/7/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C++动态内存的析构
Jolan
2010/7/27镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
delete [] mPtr
就像娶了个老婆,带着被子过门的
离得时候那被子你不还得让她带走么
再加上个
Student(const Student& other):x(other.x),y(other.y),mPtr(new int[x*y]){NULL;}
浅拷贝的问题,你的同一块内存释放了两次
【 在 Jolan 的大作中提到: 】
: #include "stdafx.h"
: class Student
: {
: ...................
谢谢LS,LSS两位,找到问题了,修改了程序,如下, 运行没问题了,但结果不对。
// TestDeConstruct.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
class Student
{
public:
Student()
{
x = 0;
y = 0;
mPtr = NULL;
}
Student(int m , int n)
{
x = m;
y =n;
mPtr = new int[m *n];
}
~Student()
{
if(mPtr)
delete[] mPtr;
}
Student Add(Student& stu)
{
Student s(stu.x,stu.y);
for(int i = 0; i < s.x * s.y; i++)
s.mPtr[i] = this->mPtr[i] + stu.mPtr[i];
//*(s.mPtr++) = *(this->mPtr++) + *(stu.mPtr++);
return s;
}
Student(const Student& stu):x(stu.x),y(stu.y),mPtr(new int[stu.x * stu.y])
{
}
int x;
int y;
int* mPtr;
};
int _tmain(int argc, _TCHAR* argv[])
{
Student stu(10,10);
Student s(10,10);
Student s2(10,10);
for(int i = 0; i < s.x * s.y; i++)
{
// *(s.mPtr++) = 1;
// *(stu.mPtr++) = 2;
s.mPtr[i] = 1;
stu.mPtr[i] = 2;
}
Student s3(s.Add(stu));
return 0;
}
最后的最后的s3里面没有结果,全是负的。。。
【 在 monarch 的大作中提到: 】
: 复制构造函数实现不对,只是给他申请了空间,没有给赋值啊
: --
: - - - - 远离暧昧,好好编程!!!
: ...................
解决了,谢谢!!
// TestDeConstruct.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
class Student
{
public:
Student()
{
x = 0;
y = 0;
mPtr = NULL;
}
Student(int m , int n)
{
x = m;
y =n;
mPtr = new int[m *n];
}
~Student()
{
if(mPtr)
delete[] mPtr;
}
Student Add(Student& stu)
{
Student s(stu.x,stu.y);
for(int i = 0; i < s.x * s.y; i++)
s.mPtr[i] = this->mPtr[i] + stu.mPtr[i];
//*(s.mPtr++) = *(this->mPtr++) + *(stu.mPtr++);
return s;
}
Student(const Student& stu):x(stu.x),y(stu.y),mPtr(new int[stu.x * stu.y])
{
memcpy(mPtr, stu.mPtr, stu.x * stu.y * sizeof(int));
}
void operator= (const Student& stu)
{
x = stu.x;
y = stu.y;
if(!mPtr)
mPtr = new int[stu.x * stu.y];
memcpy(mPtr, stu.mPtr, stu.x * stu.y * sizeof(int));
//Student st;
//st.x = stu.x;
//st.y = stu.y;
//st.mPtr = new int [stu.x * stu.y];
//memcpy(st.mPtr, stu.mPtr, stu.x * stu.y * sizeof(int));
//return st;
}
int x;
int y;
int* mPtr;
};
int _tmain(int argc, _TCHAR* argv[])
{
Student stu(10,10);
Student s(10,10);
for(int i = 0; i < s.x * s.y; i++)
{
// *(s.mPtr++) = 1;
// *(stu.mPtr++) = 2;
s.mPtr[i] = 1;
stu.mPtr[i] = 2;
}
Student s3(s.Add(stu));
Student s2;
s2 = s3;
Student s4;
s4 = s3;
return 0;
}