如何在C ++中管理成员变量

时间:2010-06-01 15:38:31

标签: c++ oop pointers

简而言之,我的问题是将成员变量作为非托管C ++中的指针。

在java或c#中,我们有“高级指针”。实际上,我们无法意识到它们中的“指针”。我们通常会初始化类的成员:

member = new Member();

member = null;

但在c ++中,它变得更加混乱。我见过很多样式:使用new,或者将成员变量保留在堆栈中。

在我看来,使用boost::shared_ptr似乎很友好,但在boost本身的源代码中,到处都有new。这是效率的问题,不是吗?

是否有一个像“尽力避免new”或其他什么的指甲?

修改

我意识到说“把它们留在堆栈中”是不恰当的,这是一个更恰当的说法:当我需要object作为我的成员变量时,我应该更喜欢object吗?一个object*

7 个答案:

答案 0 :(得分:15)

Boost源代码不是编写源代码的好例子。 Boost库旨在包含所有繁琐,困难且容易出错的代码,以便您不必在代码中担心它。

您最好的选择是遵循代码中的两条一般规则:

  • 不要在不需要使用指针的情况下使用指针
  • 如果您需要使用指针,请使用智能指针(例如shared_ptrscoped_ptr

答案 1 :(得分:8)

是的,有一个指南 - 只在必要时才使用动态分配。很多时候你可以而且应该使用值,而不是指针。例如,您几乎应该总是使用:

vector <string> v;

而不是:

vector <string *> v;

并动态分配字符串。

答案 2 :(得分:2)

答案 3 :(得分:2)

当然,如果你在构造函数中执行一个new,并且在析构函数中执行一次删除,它就不会杀了你。在这种简单的情况下,使用智能指针只是毫无意义的开销。

如果你变得更复杂,或者你对异常安全感到偏执,智能指针可能是一个好主意。

答案 4 :(得分:0)

使用shared_ptr的好处是它是一个“智能指针”,不需要显式delete来释放内存。否则,如果您使用new,则必须在不再需要该对象后显式调用delete以释放已分配的内存。

答案 5 :(得分:0)

在C ++中,开发人员可以选择它。有更多的权力,但也有更多的责任。

示例:

声明具有任意大小内部存储的对象的类。

  1. 如果您将此类设计为在实例化时分配最坏情况存储,则可以完全避免使用指针。但就普通情况而言,内存使用量的成本很高。

  2. 如果您根据需要设计类来分配内存,则可以选择使用指针。然后每个实例将只从堆中获取它所需的内容。但是你必须小心避免指针错误。

  3. 如果您根据需要设计类来分配内存,您仍然可以使用内存抽象(即auto_ptr或自定义缓冲区方案等)来避免使用指针。

  4. 因此,在使用应用程序代码中的裸指针之前,可能需要探索可用的选项。库代码的平衡可能不同,因为它的范围会更加有限,可能对性能更敏感,并且(希望)可以更好地进行测试。

答案 6 :(得分:-2)

您可能希望使用C ++ STL类“autoptr”来管理您的内存。

此外,在C ++中,如果它是一个成员变量,则它不必是指针。

class MyClass
{
    MyClass();

    MyMember a;
    MyMember* b;
    std::auto_ptr<MyMember> c;
}

MyClass::MyClass()
{
    // constructer
    // a is now instantiated -- I don't have to do anything
    b = new MyMember(); // I'll have to delete it in the destructor
    c.reset(new MyMember()); // I won't have to delete it in the destructor
}