【发布时间】:2012-05-20 03:47:16
【问题描述】:
我在当前的项目中遇到了困难。在以前的版本中,我使用了 std::vectors,一切都很好,没有内存泄漏,没有错误,很好。
然后我改用了一些指针,因为它更优雅,而且我的性能有所提高。
所以我有类似的课程
class A
{
private:
std::string str;
public:
A() {str = "";}
};
class B
{
private:
std::string str;
A* a;
public:
B() {str = ""; a = NULL; }
};
class C
{
private:
std::vector<B*> bs;
public:
C() { bs = std::vector<B*>(); }
};
我知道每次使用new,之后我都必须delete。所以我为class B 和class C 创建析构函数。
我认为它应该是这样的:
B::~B()
{
if ( this->a != NULL )
delete this->a;
}
C::~C()
{
while ( (this->bs).size() > 0 )
{
if ( (this->bs).back() != NULL )
delete (this->bs).back();
(this->bs).pop_back();
}
(this->bs).clear(); // not necessary since bs has size 0?
}
但是,我遇到了各种错误,例如 valgrind 中的“无效读取大小为 4”。
我认为析构函数应该是什么样子的想法可以吗?
我的代码还有什么问题?
将私有std::string 成员更改为std::string-pointers 会更好吗?
在析构函数中做str = "";是必要的还是好事?
附带说明:请理解我已经对“适当的析构函数”和类似关键字进行了大量搜索,但没有帮助。如果你认为这个问题被问得太频繁了:我不知道,因为我不明白。
【问题讨论】:
-
啊哈哈哈哈——我觉得你对优雅的看法有点缺陷!至于效率……您是否进行了性能测试来证明这种提高??
-
“我使用了 std::vectors,一切都很好”。是的,
std::vector通常就是这种情况。这告诉你什么? -
我非常怀疑你仅仅使用
new/delete而不是使用stl容器和智能指针就能获得300%的性能提升。 -
@stefan - 您提供了一个非常不完整的程序草图。如果您想获得比猜测更好的答案,请提供一个简短、完整程序来演示问题。见sscce.org。
-
缺少
main、#includes,以及任何提及new运算符的内容。缺少向您的vector添加任何元素。即使添加了main,这个程序也不会产生你抱怨的错误。
标签: c++ class destructor