在C++中如何copy一个对象,进行深copy

在C++中如何copy一个对象,进行深copy

修改拷贝后的对象不影响之前的对象,如何操作?

在C++中进行对象的深拷贝(Deep Copy)是确保拷贝后的对象与原对象互不影响的重要操作。深拷贝不仅复制对象的基本数据成员,还复制动态分配的内存或资源,使得两个对象完全独立。

以下是关于如何在C++中实现深拷贝的详细说明和示例。

浅拷贝与深拷贝

浅拷贝(Shallow Copy)

浅拷贝复制对象的所有成员,包括指针,但不复制指针所指向的内容。因此,浅拷贝后的对象和原对象共享相同的内存资源,这可能导致意外的副作用,例如一个对象修改了共享资源,另一个对象也会受到影响。

深拷贝(Deep Copy)

深拷贝不仅复制对象的所有成员,还复制指针所指向的内容。这样,拷贝后的对象拥有自己独立的内存资源,彼此之间互不影响。

实现深拷贝的方法

要实现深拷贝,通常需要以下步骤:

自定义拷贝构造函数(Copy Constructor):

复制对象时调用,用于创建新对象。

自定义赋值运算符(Copy Assignment Operator):

赋值操作时调用,用于将一个对象的值赋给另一个已存在的对象。

自定义析构函数(Destructor):

释放动态分配的内存,防止内存泄漏。

这三者通常被称为“三大法则”(Rule of Three)。在C++11及以后的版本中,如果类需要管理资源,还应考虑移动构造函数和移动赋值运算符,这被称为“五大法则”(Rule of Five)。

示例代码

以下是一个实现深拷贝的示例,包含自定义拷贝构造函数和赋值运算符。

#ifndef PERSON_H

#define PERSON_H

#include

#include

class Person {

public:

// 构造函数

Person(const char* name, int age);

// 拷贝构造函数(深拷贝)

Person(const Person& other);

// 赋值运算符(深拷贝)

Person& operator=(const Person& other);

// 析构函数

~Person();

// 成员函数

void introduce() const;

// 修改姓名

void setName(const char* newName);

private:

char* name;

int age;

};

#endif // PERSON_H

#include "Person.h"

// 构造函数

Person::Person(const char* name, int age) : age(age) {

if (name) {

​ this->name = new char[strlen(name) + 1];

​ strcpy(this->name, name);

} else {

​ this->name = nullptr;

}

std::cout << "Constructor called for " << this->name << std::endl;

}

// 拷贝构造函数(深拷贝)

Person::Person(const Person& other) : age(other.age) {

if (other.name) {

​ name = new char[strlen(other.name) + 1];

​ strcpy(name, other.name);

} else {

​ name = nullptr;

}

std::cout << "Copy Constructor called for " << (name ? name : "nullptr") << std::endl;

}

// 赋值运算符(深拷贝)

Person& Person::operator=(const Person& other) {

if (this == &other) {

​ return *this; // 自我赋值检查

}

// 释放现有资源

delete[] name;

// 复制年龄

age = other.age;

// 深拷贝姓名

if (other.name) {

​ name = new char[strlen(other.name) + 1];

​ strcpy(name, other.name);

} else {

​ name = nullptr;

}

std::cout << "Assignment Operator called for " << (name ? name : "nullptr") << std::endl;

return *this;

}

// 析构函数

Person::~Person() {

std::cout << "Destructor called for " << (name ? name : "nullptr") << std::endl;

delete[] name;

}

// 成员函数

void Person::introduce() const {

std::cout << "Hello, my name is " << (name ? name : "Unnamed") << " and I am " << age << " years old." << std::endl;

}

void Person::setName(const char* newName) {

delete[] name;

if (newName) {

​ name = new char[strlen(newName) + 1];

​ strcpy(name, newName);

} else {

​ name = nullptr;

}

}

#include "Person.h"

int main() {

// 创建原始对象

Person alice("Alice", 30);

alice.introduce();

// 使用拷贝构造函数进行深拷贝

Person bob = alice;

bob.introduce();

// 修改拷贝后的对象

bob.setName("Bob");

bob.introduce();

// 确认原始对象不受影响

alice.introduce();

// 使用赋值运算符进行深拷贝

Person charlie("Charlie", 25);

charlie.introduce();

charlie = alice;

charlie.introduce();

// 修改赋值后的对象

charlie.setName("Charlie Changed");

charlie.introduce();

// 确认原始对象不受影响

alice.introduce();

return 0;

}

输出结果

运行上述代码,你将看到以下输出,验证深拷贝的正确性:

Constructor called for Alice

Hello, my name is Alice and I am 30 years old.

Copy Constructor called for Alice

Hello, my name is Alice and I am 30 years old.

Hello, my name is Bob and I am 30 years old.

Hello, my name is Alice and I am 30 years old.

Constructor called for Charlie

Hello, my name is Charlie and I am 25 years old.

Assignment Operator called for Alice

Hello, my name is Alice and I am 30 years old.

Hello, my name is Charlie Changed and I am 30 years old.

Hello, my name is Alice and I am 30 years old.

Destructor called for Bob

Destructor called for Alice

Destructor called for Charlie Changed

Destructor called for Alice

说明

构造函数:为对象分配内存并初始化成员变量。

拷贝构造函数:在创建新对象时,分配新的内存并复制内容,确保新对象拥有自己独立的内存空间。

赋值运算符:释放现有资源,分配新内存并复制内容,同样确保对象的独立性。

析构函数:释放动态分配的内存,防止内存泄漏。

setName 函数:修改对象的姓名,展示深拷贝后对象之间互不影响。

通过上述实现,当你拷贝一个 Person 对象并修改拷贝后的对象时,原始对象的状态保持不变,确保了深拷贝的效果。

注意事项

资源管理:对于管理动态资源的类,确保拷贝构造函数、赋值运算符和析构函数的正确实现,以避免内存泄漏和双重释放等问题。

异常安全:在复杂的类中,实现深拷贝时应考虑异常安全性,例如在分配新资源之前不改变原有对象的状态。

Rule of Three/Five:如果一个类需要自定义拷贝构造函数、赋值运算符或析构函数中的任何一个,那么通常需要同时自定义其他两个,以确保资源管理的一致性。在C++11及以后版本中,还应考虑移动构造函数和移动赋值运算符。

总结

在C++中,通过自定义拷贝构造函数和赋值运算符,可以实现对象的深拷贝,确保拷贝后的对象与原对象在资源上完全独立。这对于管理动态资源的类尤为重要,有助于避免内存泄漏和数据共享引发的潜在问题。


在c++中,我创建一个person的对象 person personA = personB; 当我修改personA 里边的成员变量时,personB的成员变量会受到影响吗?

默认拷贝行为:在没有自定义拷贝构造函数和赋值运算符的情况下,C++会执行浅拷贝,这可能导致多个对象共享同一块内存,修改一个对象的成员变量会影响到其他对象。

实现深拷贝:通过自定义拷贝构造函数和赋值运算符,确保每个对象在拷贝时分配独立的内存资源,修改一个对象不会影响到另一个对象。

最佳实践:

如果类中包含动态分配的资源(如指针),应遵循三大法则(Rule of Three),即自定义拷贝构造函数、赋值运算符和析构函数。

在C++11及以后的版本中,还应考虑移动构造函数和移动赋值运算符(五大法则,Rule of Five)。

通过正确实现深拷贝,可以确保在拷贝对象后,修改拷贝后的对象不会影响到原始对象,从而避免潜在的错误和资源管理问题。


在C++中,当你使用如下语句创建一个Person对象: 是否修改personA中的成员变量会影响到personB,取决于Person类的拷贝方式(浅拷贝或深拷贝)以及类中成员变量的类型。 浅拷贝 vs 深拷贝 浅拷贝(Shallow Copy) 定义:浅拷贝会复制对象的所有成员,包括指针,但不复制指针所指向的内容。 影响:如果类中包含指针或动态分配的内存,浅拷贝会导致多个对象共享同一块内存区域,修改一个对象的指针指向的数据会影响到其他对象。 深拷贝(Deep Copy) 定义:深拷贝不仅复制对象的成员,还会复制指针所指向的数据,确保每个对象都有自己独立的资源。 影响:修改一个对象的成员变量不会影响到其他对象,因为它们拥有独立的内存资源。 默认拷贝行为 在没有自定义拷贝构造函数和赋值运算符的情况下,C++会生成默认的浅拷贝行为。这意味着: 对于简单数据类型(如int, double等),成员变量的值会被复制,两个对象互不影响。 对于指针类型,只会复制指针的地址,不会复制指针指向的数据,因此会导致多个对象共享同一块内存。 示例分析 假设你有如下Person类: 输出结果 说明 在上述示例中: 创建了personB对象,名字为"Bob"。 使用默认的拷贝构造函数创建了personA,它也是"Bob"。 修改personA的名字为"Alice"。 观察到personB的名字也变成了"Alice"。 这是因为默认的拷贝构造函数进行了浅拷贝,personA和personB的name成员指向了同一块内存。因此,修改personA的name会影响到personB。 实现深拷贝 为了避免上述问题,需要在Person类中实现深拷贝,即自定义拷贝构造函数和赋值运算符,确保每个对象拥有自己独立的内存资源。 修改后的 Person 类 修改后的输出结果 说明 在深拷贝的实现中: 自定义了拷贝构造函数和赋值运算符,使得每个Person对象在拷贝时都分配了独立的内存。 当personA通过拷贝personB创建后,personA和personB的name指针指向不同的内存区域。 修改personA的name不会影响personB,因为两者拥有独立的内存。 总结 默认拷贝行为:在没有自定义拷贝构造函数和赋值运算符的情况下,C++会执行浅拷贝,这可能导致多个对象共享同一块内存,修改一个对象的成员变量会影响到其他对象。 实现深拷贝:通过自定义拷贝构造函数和赋值运算符,确保每个对象在拷贝时分配独立的内存资源,修改一个对象不会影响到另一个对象。 最佳实践: 如果类中包含动态分配的资源(如指针),应遵循三大法则(Rule of Three),即自定义拷贝构造函数、赋值运算符和析构函数。 在C++11及以后的版本中,还应考虑移动构造函数和移动赋值运算符(五大法则,Rule of Five)。 通过正确实现深拷贝,可以确保在拷贝对象后,修改拷贝后的对象不会影响到原始对象,从而避免潜在的错误和资源管理问题。


在C++中,当你使用如下语句创建一个Person对象:

person personA = personB;

是否修改personA中的成员变量会影响到personB,取决于Person类的拷贝方式(浅拷贝或深拷贝)以及类中成员变量的类型。

浅拷贝 vs 深拷贝

浅拷贝(Shallow Copy)

定义:浅拷贝会复制对象的所有成员,包括指针,但不复制指针所指向的内容。

影响:如果类中包含指针或动态分配的内存,浅拷贝会导致多个对象共享同一块内存区域,修改一个对象的指针指向的数据会影响到其他对象。

深拷贝(Deep Copy)

定义:深拷贝不仅复制对象的成员,还会复制指针所指向的数据,确保每个对象都有自己独立的资源。

影响:修改一个对象的成员变量不会影响到其他对象,因为它们拥有独立的内存资源。

默认拷贝行为

在没有自定义拷贝构造函数和赋值运算符的情况下,C++会生成默认的浅拷贝行为。这意味着:

对于简单数据类型(如int, double等),成员变量的值会被复制,两个对象互不影响。

对于指针类型,只会复制指针的地址,不会复制指针指向的数据,因此会导致多个对象共享同一块内存。

示例分析

假设你有如下Person类:

#ifndef PERSON_H

#define PERSON_H

#include

#include

class Person {

public:

// 构造函数

Person(const char* name, int age);

// 拷贝构造函数(默认浅拷贝)

// 如果不自定义,C++ 会生成默认的浅拷贝

// 赋值运算符(默认浅拷贝)

// 如果不自定义,C++ 会生成默认的浅拷贝

// 析构函数

~Person();

// 成员函数

void introduce() const;

// 修改姓名

void setName(const char* newName);

private:

char* name;

int age;

};

#endif // PERSON_H

#include "Person.h"

// 构造函数

Person::Person(const char* name, int age) : age(age) {

if (name) {

​ this->name = new char[strlen(name) + 1];

​ strcpy(this->name, name);

} else {

​ this->name = nullptr;

}

std::cout << "Constructor called for " << (this->name ? this->name : "nullptr") << std::endl;

}

// 析构函数

Person::~Person() {

std::cout << "Destructor called for " << (name ? name : "nullptr") << std::endl;

delete[] name;

}

// 成员函数

void Person::introduce() const {

std::cout << "Hello, my name is " << (name ? name : "Unnamed") << " and I am " << age << " years old." << std::endl;

}

void Person::setName(const char* newName) {

delete[] name;

if (newName) {

​ name = new char[strlen(newName) + 1];

​ strcpy(name, newName);

} else {

​ name = nullptr;

}

}

#include "Person.h"

int main() {

// 创建 personB 对象

Person personB("Bob", 25);

personB.introduce();

// 使用默认拷贝构造函数进行浅拷贝

Person personA = personB;

personA.introduce();

// 修改 personA 的 name

personA.setName("Alice");

personA.introduce();

// 查看 personB 是否受到影响

personB.introduce();

return 0;

}

输出结果Constructor called for BobHello, my name is Bob and I am 25 years old.Hello, my name is Bob and I am 25 years old.Hello, my name is Alice and I am 25 years old.Hello, my name is Alice and I am 25 years old.Destructor called for AliceDestructor called for Alice

说明

在上述示例中:

创建了personB对象,名字为"Bob"。

使用默认的拷贝构造函数创建了personA,它也是"Bob"。

修改personA的名字为"Alice"。

观察到personB的名字也变成了"Alice"。

这是因为默认的拷贝构造函数进行了浅拷贝,personA和personB的name成员指向了同一块内存。因此,修改personA的name会影响到personB。

实现深拷贝

为了避免上述问题,需要在Person类中实现深拷贝,即自定义拷贝构造函数和赋值运算符,确保每个对象拥有自己独立的内存资源。

修改后的 Person 类#ifndef PERSON_H#define PERSON_H#include #include class Person {public: // 构造函数 Person(const char* name, int age); // 拷贝构造函数(深拷贝) Person(const Person& other); // 赋值运算符(深拷贝) Person& operator=(const Person& other); // 析构函数 Person(); // 成员函数 void introduce() const; // 修改姓名 void setName(const char* newName);private: char* name; int age;};#endif // PERSON_H#include "Person.h"// 构造函数Person::Person(const char* name, int age) : age(age) { if (name) { this->name = new char[strlen(name) + 1]; strcpy(this->name, name); } else { this->name = nullptr; } std::cout << "Constructor called for " << (this->name ? this->name : "nullptr") << std::endl;}// 拷贝构造函数(深拷贝)Person::Person(const Person& other) : age(other.age) { if (other.name) { name = new char[strlen(other.name) + 1]; strcpy(name, other.name); } else { name = nullptr; } std::cout << "Copy Constructor called for " << (name ? name : "nullptr") << std::endl;}// 赋值运算符(深拷贝)Person& Person::operator=(const Person& other) { if (this == &other) { return *this; // 自我赋值检查 } // 释放现有资源 delete[] name; // 复制年龄 age = other.age; // 深拷贝姓名 if (other.name) { name = new char[strlen(other.name) + 1]; strcpy(name, other.name); } else { name = nullptr; } std::cout << "Assignment Operator called for " << (name ? name : "nullptr") << std::endl; return *this;}// 析构函数Person::Person() { std::cout << "Destructor called for " << (name ? name : "nullptr") << std::endl; delete[] name;}// 成员函数void Person::introduce() const { std::cout << "Hello, my name is " << (name ? name : "Unnamed") << " and I am " << age << " years old." << std::endl;}void Person::setName(const char* newName) { delete[] name; if (newName) { name = new char[strlen(newName) + 1]; strcpy(name, newName); } else { name = nullptr; }}#include "Person.h"int main() { // 创建 personB 对象 Person personB("Bob", 25); personB.introduce(); // 使用自定义拷贝构造函数进行深拷贝 Person personA = personB; personA.introduce(); // 修改 personA 的 name personA.setName("Alice"); personA.introduce(); // 查看 personB 是否受到影响 personB.introduce(); return 0;}

修改后的输出结果Constructor called for BobHello, my name is Bob and I am 25 years old.Copy Constructor called for BobHello, my name is Bob and I am 25 years old.Hello, my name is Alice and I am 25 years old.Hello, my name is Bob and I am 25 years old.Destructor called for AliceDestructor called for BobDestructor called for Bob

说明

在深拷贝的实现中:

自定义了拷贝构造函数和赋值运算符,使得每个Person对象在拷贝时都分配了独立的内存。

当personA通过拷贝personB创建后,personA和personB的name指针指向不同的内存区域。

修改personA的name不会影响personB,因为两者拥有独立的内存。

总结

默认拷贝行为:在没有自定义拷贝构造函数和赋值运算符的情况下,C++会执行浅拷贝,这可能导致多个对象共享同一块内存,修改一个对象的成员变量会影响到其他对象。

实现深拷贝:通过自定义拷贝构造函数和赋值运算符,确保每个对象在拷贝时分配独立的内存资源,修改一个对象不会影响到另一个对象。

最佳实践:

如果类中包含动态分配的资源(如指针),应遵循三大法则(Rule of Three),即自定义拷贝构造函数、赋值运算符和析构函数。

在C++11及以后的版本中,还应考虑移动构造函数和移动赋值运算符(五大法则,Rule of Five)。

通过正确实现深拷贝,可以确保在拷贝对象后,修改拷贝后的对象不会影响到原始对象,从而避免潜在的错误和资源管理问题。

设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。 设计并实现一个动态整型数组类Vect,要求: (1)实现构造函数重载,可以根据指定的元素个数动态创建初始值为0的整型数组,或根据指定的内置整型数组动态创建整型数组。 (2)设计拷贝构造函数和析构函数,注意使用深拷贝。 (3)设计存取指定位置的数组元素的公有成员函数,并进行下标越界,若越界则输出“out of boundary”。 (4)设计获取数组元素个数的公有成员函数。 (5)设计用于输出数组元素的公有成员函数,元素之间以空格分隔,最后以换行符结束。 在main函数中按以下顺序操作: (1)根据内置的静态整型数组{1,2,3,4,5}构造数组对象v1,根据输入的整型数构造数组对象v2。 (2)调用Vect的成员函数依次输出v1和v2的所有元素。 (3)输入指定的下标及对应的整型数,设置数组对象v1的指定元素。 (4)根据数组对象v1拷贝构造数组对象v3。 (5)调用Vect的成员函数依次输出v1和v3的所有元素。
<think>好的,用户现在想问的是C++中拷贝操作的默认行为是浅拷贝还是深拷贝。我需要结合之前的引用内容来回答这个问题。 首先,根据引用[5]提到,深拷贝和浅拷贝主要针对类中的指针和动态分配的空间。默认情况下,C++的拷贝构造函数是浅拷贝,也就是简单的值复制。引用[1]中的例子显示,深拷贝需要手动实现,比如在拷贝构造函数中分配新内存并复制内容。这说明默认情况下如果没有自定义拷贝构造函数,编译器生成的会进行浅拷贝,可能导致指针成员指向同一内存区域,引发问题。 然后,引用[4]提到深拷贝需要为指针成员分配新内存并复制内容,而浅拷贝只是复制指针的值。默认情况下,如果类中有指针成员,使用默认的拷贝构造函数会导致两个对象指向同一块内存,这在析构时可能会重复释放,导致错误。比如引用[2]指出深拷贝避免了内存泄漏和重复释放,但默认情况下是浅拷贝,所以需要自己实现深拷贝。 用户可能已经知道浅拷贝和深拷贝的基本概念,但需要确认C++的默认行为。需要明确回答默认是浅拷贝,并解释何时需要深拷贝,比如当类管理动态内存时。同时要说明默认行为的问题,如重复释放,以及如何通过自定义拷贝构造函数和赋值运算符来实现深拷贝,如引用[3]和[4]中的示例。 还要注意用户之前的问题是关于乘除法的性能,现在转向拷贝机制,可能需要用例子说明,比如默认拷贝导致的问题,以及如何解决。需要结构清晰,分点说明默认行为、潜在风险、如何实现深拷贝,最后总结应用场景。</think>### C++中拷贝操作的默认行为解析 在C++中,**拷贝操作的默认行为是浅拷贝**(Shallow Copy),但这一行为会根据对象成员的类型和资源管理方式产生不同的影响。以下是具体分析: --- ### 一、默认拷贝行为:浅拷贝 1. **基本规则** C++编译器会为类**自动生成默认的拷贝构造函数和拷贝赋值运算符**,其行为是**逐成员复制**(Member-wise Copy)。对于指针、动态内存等资源,仅复制指针值(地址),而非指向的实际数据[^1][^5]。 2. **示例代码** ```cpp class ShallowCopyExample { public: int* data; ShallowCopyExample(int value) { data = new int(value); } // 编译器生成的默认拷贝构造函数:浅拷贝 // ShallowCopyExample(const ShallowCopyExample& other) : data(other.data) {} ~ShallowCopyExample() { delete data; } }; int main() { ShallowCopyExample obj1(10); ShallowCopyExample obj2 = obj1; // 浅拷贝 *obj2.data = 20; // 修改obj2会影响obj1 std::cout << *obj1.data; // 输出20(预期应为10) // 程序崩溃:obj1和obj2析构时重复释放同一内存 } ``` **问题**:两个对象的`data`成员指向同一内存,导致**重复释放**和**逻辑耦合**[^2][^5]。 --- ### 二、浅拷贝的适用场景与风险 1. **适用场景** - 类成员均为**基本数据类型**(`int`, `double`等) - 类成员包含指针但**不管理动态资源**(如观察指针) - 明确需要共享资源的场景(需配合智能指针) 2. **风险场景** - 类成员包含**动态分配的资源**(如`new`分配的堆内存) - 文件句柄、网络连接等**非复制型资源** - 未使用RAII(Resource Acquisition Is Initialization)管理的资源[^4][^5] --- ### 三、深拷贝的主动实现 当类涉及资源管理时,需通过以下方式**显式实现深拷贝**(Deep Copy): 1. **自定义拷贝构造函数** ```cpp class DeepCopyExample { public: int* data; DeepCopyExample(int value) { data = new int(value); } // 深拷贝构造函数 DeepCopyExample(const DeepCopyExample& other) { data = new int(*other.data); // 分配新内存并复制值 } // 深拷贝赋值运算符 DeepCopyExample& operator=(const DeepCopyExample& other) { if (this != &other) { delete data; // 释放旧资源 data = new int(*other.data); // 分配新内存并复制值 } return *this; } ~DeepCopyExample() { delete data; } }; ``` **效果**:拷贝后的对象与原对象完全独立[^1][^4]。 2. **深拷贝的代价** - 时间成本:需逐字节复制数据,对大型数据(如数组)效率较低 - 内存成本:额外分配内存可能导致内存碎片[^2][^3] --- ### 四、现代C++的优化替代方案 1. **使用智能指针** - `std::unique_ptr`:禁止拷贝,强制移动语义 - `std::shared_ptr`:通过引用计数共享资源,避免重复释放 ```cpp #include <memory> class SmartPointerExample { public: std::shared_ptr<int> data; SmartPointerExample(int value) : data(std::make_shared<int>(value)) {} // 默认拷贝构造函数即可安全共享资源 }; ``` 2. **移动语义(C++11+)** 通过移动构造函数和移动赋值运算符转移资源所有权: ```cpp class MoveExample { public: int* data; MoveExample(int value) : data(new int(value)) {} // 移动构造函数 MoveExample(MoveExample&& other) noexcept : data(other.data) { other.data = nullptr; // 确保原对象析构安全 } }; ``` --- ### 五、总结:默认行为与开发建议 | 特性 | 浅拷贝 | 深拷贝 | |-------------------|------------------------------|--------------------------------| | **默认行为** | ✔️ | ❌(需手动实现) | | **资源独立性** | 共享资源 | 独立资源 | | **内存安全** | 高风险(重复释放) | 安全 | | **性能** | 高 | 低(数据量大时) | **开发建议**: - 若类管理资源(动态内存、文件句柄等),**必须实现深拷贝或禁用拷贝**(通过`= delete`)[^4] - 优先使用智能指针和容器(如`std::vector`)替代裸指针 - 对不可复制的资源使用移动语义优化性能 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值