你能解释一下代码吗?

use*_*692 -4 c++

在堆上创建的对象被分配给堆栈对象.它是某种复制浅拷贝吗?

#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)

Tho*_*ews 6

该语句Student s1 = *s; 制作了指向的内容的副本s.如果s删除,则不会影响s1.与...相同s2.

编辑1:
我没注意到你的帖子中有一个指针.但是,由于您没有将其初始化为指向任何内容,因此没有内存泄漏,也没有复制问题.

但是,如果使用指针,则必须决定如何复制数据.你会将指针复制到数据吗?您是否会制作新的数据副本(旧数据应该删除)?

使用std::string而不是char *有助于防止这种内存管理问题.


eva*_*van 5

正确,s1s2包含内容的副本s.ie s1.names2.name指向与s.name(未写入的初始化)相同的内存地址.当你超出范围时s,所有堆栈变量(在这种情况下,s1s2)都会被销毁.

由于s只是一个指针,什么都不会发生(如果你没有叫你会泄漏delete s,但s1s2是类,所以析构函数,当你走出去的范围内运行.