在堆上创建的对象被分配给堆栈对象.它是某种复制浅拷贝吗?
#include <iostream>
using namespace std;
class Student
{
private:
char *name;
};
int main()
{
Student *s = new Student();
Student s1 = *s;
Student s2;
s2 = s1;
delete s;
// it will delete the object s and s1 and s2 are deleted when out of scope?
//after the curly braces?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该语句Student s1 = *s; 制作了指向的内容的副本s.如果s删除,则不会影响s1.与...相同s2.
编辑1:
我没注意到你的帖子中有一个指针.但是,由于您没有将其初始化为指向任何内容,因此没有内存泄漏,也没有复制问题.
但是,如果使用指针,则必须决定如何复制数据.你会将指针复制到数据吗?您是否会制作新的数据副本(旧数据应该删除)?
使用std::string而不是char *有助于防止这种内存管理问题.
正确,s1并s2包含内容的副本s.ie s1.name并s2.name指向与s.name(未写入的初始化)相同的内存地址.当你超出范围时s,所有堆栈变量(在这种情况下,s1和s2)都会被销毁.
由于s只是一个指针,什么都不会发生(如果你没有叫你会泄漏delete s,但s1并s2是类,所以析构函数,当你走出去的范围内运行.