gpt4 book ai didi

c++ - 哪个指针赋值更好(C++)

转载 作者:行者123 更新时间:2023-11-27 23:25:57 26 4
gpt4 key购买 nike

foo.h

#include "class1.h"

class foo{

private:
class1* class1ObjectPointer;

public:
foo();
virtual ~foo();

void foomethod();

}

foo.cpp(版本 1)

#include "foo.h"

foo::foo()
{
this->class1ObjectPointer = new class1();
}


foo::~foo()
{
if( this->class1ObjectPointer != NULL ){

delete class1ObjectPointer;
this->class1ObjectPointer = NULL;
}
}


foo::foomethod(){

*(this->class1ObjectPointer) = some_method();
//suppose some method returns an object of class1

}

foo.cpp(版本 2)

#include "foo.h"

foo::foo()
{
this->class1ObjectPointer = NULL;
}


foo::~foo()
{
if( this->class1ObjectPointer != NULL ){

delete class1ObjectPointer;
this->class1ObjectPointer = NULL;
}
}


foo::foomethod(){

class1 object;
object = some_method();
//suppose some method returns an object of class1
this->class1ObjectPointer = new class1(object); // copy constructor
}

在下列情况下,哪种指针赋值更好:

  1. class1 的对象始终具有固定大小(例如,其中包含固定变量的类)
  2. 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()));
};

如果你真的想自己管理它,那么你需要根据 Rule of Three 覆盖默认的复制构造函数和复制赋值运算符。 ,请确保在重新分配指针时删除旧对象,并注意异常安全。并且无需在删除之前检查 NULL,也无需在析构函数中分配 NULL

关于c++ - 哪个指针赋值更好(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9535567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com