C++ 哪种指针赋值更好(C+;+;)
foo.h foo.cpp(第1版) foo.cpp(第2版) 在以下情况下,哪种指针分配更好:C++ 哪种指针赋值更好(C+;+;),c++,pointers,memory-management,constructor,copy-constructor,C++,Pointers,Memory Management,Constructor,Copy Constructor,foo.h foo.cpp(第1版) foo.cpp(第2版) 在以下情况下,哪种指针分配更好: class1的对象始终具有固定大小(例如,其中包含固定变量的类) class1的对象可能具有大小可变的成员(例如,其中包含可能具有不同大小的矩阵的类) 您能推荐其他更好的方法来完成我在这些代码段中所做的工作吗?不管任何赋值,类的实例都具有恒定的大小。 如果将成员变量指定给某个指针,则实例的大小不会更改。内存中的一些垃圾(如果您先初始化它,则为空值)将被其他分配对象的地址替换。类的实例大小不变,而不
您能推荐其他更好的方法来完成我在这些代码段中所做的工作吗?不管任何赋值,类的实例都具有恒定的大小。
如果将成员变量指定给某个指针,则实例的大小不会更改。内存中的一些垃圾(如果您先初始化它,则为空值)将被其他分配对象的地址替换。类的实例大小不变,而不考虑任何赋值。 如果将成员变量指定给某个指针,则实例的大小不会更改。内存中的一些垃圾(如果您首先初始化了它,则为空值)将被其他分配对象的地址替换
删除之前是多余的,因为它在内部进行检查
std::unique_ptr
(需要C++11)或boost::shared_ptr
foo::foo() : class1ObjectPointer(new class1) { }
这使用了一个删除之前是多余的,因为它在内部进行检查
std::unique_ptr
(需要C++11)或boost::shared_ptr
foo::foo() : class1ObjectPointer(new class1) { }
这使用了一个class foo {
private:
class1 class1Object;
public:
// implicit constructors, assignment and destructor are fine
void foomethod() {class1Object = some_method();}
};
第二种情况毫无意义——特定类的对象大小都相同
如果确实需要存储指针(可能是因为需要多态性),那么最简单的处理方法就是使用智能指针:
class foo {
private:
std::unique_ptr<class1> class1ObjectPointer;
public:
foo() : class1ObjectPointer(new class1) {}
// implicit copying and destructor are fine
foomethod() {*class1ObjectPointer = some_method();}
// or, if not assignable, class1ObjectPointer.reset(new class1(*some_method()));
};
class-foo{
私人:
std::unique_ptr classobjectpointer;
公众:
foo():ClassObjectPointer(新的class1){}
//隐式复制和析构函数都可以
foomethod(){*ClassObjectPointer=some_method();}
//或者,如果不可赋值,则为ClassObjectPointer.reset(新的class1(*some_method());
};
如果确实希望自己管理它,则需要根据重写默认的复制构造函数和复制赋值运算符,确保在重新分配指针时删除旧对象,并注意异常安全。并且在删除之前不需要检查NULL
,也不需要在析构函数中分配NULL
。根据第一个示例重新分配对象可能比分配新对象更好(效率更高,更容易避免内存泄漏),如第二个示例中的内存泄漏所示
看起来你根本不需要指针;只需在类中嵌入一个对象:
class foo {
private:
class1 class1Object;
public:
// implicit constructors, assignment and destructor are fine
void foomethod() {class1Object = some_method();}
};
第二种情况毫无意义——特定类的对象大小都相同
如果确实需要存储指针(可能是因为需要多态性),那么最简单的处理方法就是使用智能指针:
class foo {
private:
std::unique_ptr<class1> class1ObjectPointer;
public:
foo() : class1ObjectPointer(new class1) {}
// implicit copying and destructor are fine
foomethod() {*class1ObjectPointer = some_method();}
// or, if not assignable, class1ObjectPointer.reset(new class1(*some_method()));
};
class-foo{
私人:
std::unique_ptr classobjectpointer;
公众:
foo():ClassObjectPointer(新的class1){}
//隐式复制和析构函数都可以
foomethod(){*ClassObjectPointer=some_method();}
//或者,如果不可赋值,则为ClassObjectPointer.reset(新的class1(*some_method());
};
如果确实希望自己管理它,则需要根据重写默认的复制构造函数和复制赋值运算符,确保在重新分配指针时删除旧对象,并注意异常安全。而且在删除之前不需要检查
NULL
,也不需要在析构函数中指定NULL
。您有什么问题?你在挣扎什么,你在问什么,这还不清楚。@DavidHeffernan我需要创建一个class1
的对象,它可以有可变的大小,但不知道哪种分配空间的方式更好。你在代码中标识为复制构造函数的东西,不是复制构造函数。复制构造函数不接受指针。@BenjaminLindley复制构造函数不接受对要复制的对象的引用作为输入吗?@Matteo:是的,但通过在对象前面加上&
,您提供的是指针,而不是引用。从调用方的角度来看,通过引用获取参数的函数与通过值获取参数的函数是无法区分的。您的问题是什么?你在挣扎什么,你在问什么,这还不清楚。@DavidHeffernan我需要创建一个class1
的对象,它可以有可变的大小,但不知道哪种分配空间的方式更好。你在代码中标识为复制构造函数的东西,不是复制构造函数。复制构造函数不接受指针。@BenjaminLindley复制构造函数不接受对要复制的对象的引用作为输入吗?@Matteo:是的,但要在