C#和C++中浅拷贝的异同

#include <iostream>
using namespace std;
class Person {
public:
    int* myInt;
};

int main() {

    Person p1;
    p1.myInt = new int(10);
    Person p2 = p1; //这句代码相当于在栈上新建了一个p2对象,采用默认的拷贝构造函数,属于浅拷贝。
    cout << "p1.myInt地址:" << p1.myInt << " p1.myInt的值:" << *p1.myInt << endl;
    delete p1.myInt;
    p1.myInt = NULL;

    //此时p2.myInt不为NULL,但是p2.myInt指向的内存已经被释放了。
    //(注意指针指向的内存已经被释放不代表指针会自动置为NULL)

    cout << "p2.myInt地址:" << p2.myInt << " p2.myInt的值:" << *p2.myInt << endl;
    //delete p2.m_height; 若p2再次释放会报错,双重释放

    system("pause");
    return 0;
}
//输出
//p1.myInt地址:0000024506977A10   p1.myInt的值:10
//p2.myInt地址:0000024506977A10   p2.myInt的值: -572662307​
public class Person
{
    public object myInt;

    public static void Main()
    {
        Person p1 = new Person();
        p1.myInt = 10;
        Person p2 = p1; //与C++中不同,这句代码相当于在栈上新建了一个引用p2,p2和p1都指向堆中的同一个Person对象,这不属于拷贝。
        Person p3 = new Person();//这句代码,相当于在堆中新建一个Person对象,栈上新建一个引用p3指向该对象。
        p3.myInt = p1.myInt;//将p3.myInt指向p1.myInt所指向的内存,类似C++的浅拷贝。
        p1.myInt = null;
        Console.WriteLine(p1.myInt);
        Console.WriteLine(p2.myInt);
        Console.WriteLine(p3.myInt);
    }
}
//输出
//空行(null)
//空行(null)
//10

猜你喜欢

转载自blog.csdn.net/Charizard_/article/details/142095541