开发者社区> 问答> 正文

C++中关于copy构造函数深拷贝的问题:? 400 报错

C++中关于copy构造函数深拷贝的问题:? 400 报错

为什么运行的时候会出错,根据调试结果来看应该是在free的时候出错,就是程序调用析构函数是出错,(而且我发现即便是不为成员变量name分配内存空间的话,程序运行反而正确,这是为什么??)代码如下:

/*
 *----------------------------
 * 析构函数.cpp
 * Created on: 2015年9月1日
 * Author: leiwei
 *----------------------------
 */

#include <iostream>
#include<string.h>

using namespace std;
class Student {
private:
	char* name;
	int age;
	float score;
public:
	//构造函数
	Student(char *, int, float);
	//析构函数
	~Student();
	//普通成员函数
	void say();
	//copy构造函数
	Student(Student& obj){
		age = obj.age;
		name = (char*)malloc(100);
		name = obj.name;
		score = obj.score;
	}
};

//构造函数
Student::Student(char* name1, int age1, float score1) {
	age = age1;
	name = (char*)malloc(100);
	name = name1;
	score = score1;
}

Student::~Student() {
	//析构函数在main函数即将结束的时候才运行
	cout << name << "再见" << endl;
	free(name);
}
//普通成员函数
void Student::say() {
	cout << name<<"的年龄是 " << age << ",成绩是 " << score << endl;
}

int test_Student() {
	Student stu1("小明", 15, 90.5f);
	stu1.say();

	Student stuObj(stu1);
	stuObj.say();
	cout << "main 函数即将运行结束" << endl;
	return 0;
}



展开
收起
爱吃鱼的程序员 2020-06-03 13:55:03 482 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    name = obj.name;
    并不是字符串拷贝!

    可以使用C的函数strcpy,或者用c++的std::string作为字符串类型。

    ######

    28行给name分配了一块内存   29行又把name指向了obj.name   导致28行分配的内存泄漏了

    解决方法一楼正解 

    ######memcpy或者strcpy进行字符串拷贝。你用等号的话28行的变量和obj里面的name指向的是同一块内存,当然会出问题了。######典型的没搞清楚指针,C++建议用 new delete######

    引用来自“您的好友”的评论

    28行给name分配了一块内存   29行又把name指向了obj.name   导致28行分配的内存泄漏了

    解决方法一楼正解 

    谢谢,已经懂了,非常感谢######

    引用来自“MAJIK”的评论

    memcpy或者strcpy进行字符串拷贝。你用等号的话28行的变量和obj里面的name指向的是同一块内存,当然会出问题了。
    谢谢,已经懂了,非常感谢
    2020-06-03 16:41:07
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载