浅拷贝不调用拷贝构造函数怎么办?

vnvlyp 2015-07-26 10:22:34
我需要写个函数返回两个东西,一个对象和一个说明是否成功的状态(int),然后我就像下面这样一写,完了发现m = MyClass("name");这样只是简单的浅拷贝,因为这个对象里有动态申请的内存,销毁对象的时候就会销毁两次那段内存导致出错。像这样的需求应该怎么写啊?



#include <iostream>
#include <cstring>

class MyClass
{
private:
char *name;
public:
MyClass(){};
MyClass(const char *name);
~MyClass();
MyClass(const MyClass &m);
};

MyClass::MyClass(const MyClass &m)
{
MyClass(m.name);
}
MyClass::~MyClass()
{
delete[] this->name;
}
MyClass::MyClass(const char *name)
{
size_t len = strlen(name);
this->name = new char[len + 1];
strcpy(this->name, name);
}


int foo(MyClass &m)
{
m = MyClass("name");

return 0;
}

int main(int argc, char **argv)
{
MyClass m;
foo(m);

std::cin.ignore();
return 0;
}

...全文
168 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2015-07-28
  • 打赏
  • 举报
回复
因为你已经理解错哪里是拷贝构造函数了 m = MyClass("name"); 这里明显调用的是赋值操作符, 按4楼说的, 即可
二班的码农 2015-07-27
  • 打赏
  • 举报
回复
MyClass& operator=(const MyClass& s) { size_t len = strlen(s.name); this->name = new char[len + 1]; strcpy(this->name, s.name); return *this; }
苏叔叔 2015-07-26
  • 打赏
  • 举报
回复
m = MyClass("name") 这里当然不会发生拷贝,浅or深。 拷贝发生在初始化的时候,而这里是赋值。 你得重载=
vnvlyp 2015-07-26
  • 打赏
  • 举报
回复
引用 1 楼 zhangxiangDavaid 的回复:
你不是已经把浅拷贝改为了深拷贝了吗
但是这样m = MyClass("name");的方式根本不会调用拷贝构造函数进行深拷贝啊 比如在拷贝构造函数里加一个输出,发现根本没有调用

#include <iostream>
#include <cstring>

using std::cout;
using std::cin;
using std::endl;

class MyClass
{
private:
	char *name;
public:
	MyClass(){};
	MyClass(const char *name);
	~MyClass();
	MyClass(const MyClass &m);
};

MyClass::MyClass(const MyClass &m)
{
	cout << "copying..." << endl;
	MyClass(m.name);
}
MyClass::~MyClass()
{
	delete[] this->name;
}
MyClass::MyClass(const char *name)
{
	size_t len = strlen(name);
	this->name = new char[len + 1];
	strcpy(this->name, name);
}


int foo(MyClass &m)
{
	m = MyClass("name");

	return 0;
}

int main(int argc, char **argv)
{
	MyClass m;
	foo(m);

	cin.ignore();
	return 0;
}

苏叔叔 2015-07-26
  • 打赏
  • 举报
回复
你不是已经把浅拷贝改为了深拷贝了吗

64,633

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧