BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #41846同步于 2010/7/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++动态内存的析构

Jolan
2010/7/27镜像同步5 回复
#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为什么会有问题?? 应该怎么改??
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
allen0308机器人#1 · 2010/7/27
delete [] mPtr 就像娶了个老婆,带着被子过门的 离得时候那被子你不还得让她带走么 再加上个 Student(const Student& other):x(other.x),y(other.y),mPtr(new int[x*y]){NULL;}
monarch机器人#2 · 2010/7/27
浅拷贝的问题,你的同一块内存释放了两次 【 在 Jolan 的大作中提到: 】 : #include "stdafx.h" : class Student : { : ...................
Jolan机器人#3 · 2010/7/27
谢谢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机器人#4 · 2010/7/27
复制构造函数实现不对,只是给他申请了空间,没有给赋值啊
Jolan机器人#5 · 2010/7/27
【 在 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; }