简而言之,我的问题是将成员变量作为非托管C ++中的指针。
在java或c#中,我们有“高级指针”。实际上,我们无法意识到它们中的“指针”。我们通常会初始化类的成员:
member = new Member();
或
member = null;
但在c ++中,它变得更加混乱。我见过很多样式:使用new
,或者将成员变量保留在堆栈中。
在我看来,使用boost::shared_ptr
似乎很友好,但在boost本身的源代码中,到处都有new
。这是效率的问题,不是吗?
是否有一个像“尽力避免new
”或其他什么的指甲?
修改
我意识到说“把它们留在堆栈中”是不恰当的,这是一个更恰当的说法:当我需要object
作为我的成员变量时,我应该更喜欢object
吗?一个object*
?
答案 0 :(得分:15)
Boost源代码不是编写源代码的好例子。 Boost库旨在包含所有繁琐,困难且容易出错的代码,以便您不必在代码中担心它。
您最好的选择是遵循代码中的两条一般规则:
shared_ptr
或scoped_ptr
)答案 1 :(得分:8)
是的,有一个指南 - 只在必要时才使用动态分配。很多时候你可以而且应该使用值,而不是指针。例如,您几乎应该总是使用:
vector <string> v;
而不是:
vector <string *> v;
并动态分配字符串。
答案 2 :(得分:2)
Stroustrup的guide to the language:
Scott Meyers的三重奏非常有用:Effective C++, More Effective C++,和 Effective STL
另见这些问题:
- https://stackoverflow.com/questions/155762/best-c-resource
- Java FAQ equivalent of C++ FAQ lite?
- C++ : handle resources if constructors may throw exceptions (Reference to FAQ 17.4]
- What C++ pitfalls should I avoid?
- New to C++. Question about constant pointers
答案 3 :(得分:2)
当然,如果你在构造函数中执行一个new,并且在析构函数中执行一次删除,它就不会杀了你。在这种简单的情况下,使用智能指针只是毫无意义的开销。
如果你变得更复杂,或者你对异常安全感到偏执,智能指针可能是一个好主意。
答案 4 :(得分:0)
使用shared_ptr
的好处是它是一个“智能指针”,不需要显式delete
来释放内存。否则,如果您使用new
,则必须在不再需要该对象后显式调用delete
以释放已分配的内存。
答案 5 :(得分:0)
在C ++中,开发人员可以选择它。有更多的权力,但也有更多的责任。
示例:
声明具有任意大小内部存储的对象的类。
如果您将此类设计为在实例化时分配最坏情况存储,则可以完全避免使用指针。但就普通情况而言,内存使用量的成本很高。
如果您根据需要设计类来分配内存,则可以选择使用指针。然后每个实例将只从堆中获取它所需的内容。但是你必须小心避免指针错误。
如果您根据需要设计类来分配内存,您仍然可以使用内存抽象(即auto_ptr或自定义缓冲区方案等)来避免使用指针。
因此,在使用应用程序代码中的裸指针之前,可能需要探索可用的选项。库代码的平衡可能不同,因为它的范围会更加有限,可能对性能更敏感,并且(希望)可以更好地进行测试。
答案 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
}