gpt4 book ai didi

c++ - 用于清理 vector 破坏的模板 - 怎么做?

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:11 26 4
gpt4 key购买 nike

我正在尝试实现一个模板,该模板允许创建一个派生自 vector<> 的类,以便在删除时删除 vector 的元素。下面的代码片段代表了这样做的尝试:

include <vector>

using namespace std;

template <class P>
class TidyVector : public vector<P> {
public:
~TidyVector() {
while (vector<P>::size()) {
P pi = vector<P>::back();
vector<P>::pop_back();
delete pi;
}
}
}

TidyVector<int*> i;

尝试使用 g++ -c try.cc 编译它会导致以下错误消息:

try.cc:1: error: expected constructor, destructor, or type conversion before '<' token
try.cc:6: error: expected template-name before '<' token
try.cc:6: error: expected `{' before '<' token
try.cc:6: error: expected unqualified-id before '<' token
try.cc:17: error: aggregate 'TidyVector<int*> i' has incomplete type and cannot be defined

这是怎么回事 - 为什么这不起作用?或者,问一个更合适的问题:处理这种情况的标准方法是什么(删除时自动清理 vector )?

最佳答案

我假设这应该是#include < vector >。所以这是一个错误。

其次,你应该避免从 vector 继承,它没有虚拟析构函数,所以你的类可以很容易地转换为标准 vector 而你的析构函数不会运行。

(哦,你把分号留在了类末尾)

第三,您是否考虑过只使用 vector > 来代替?

澄清一下为什么 shared_ptr 方法更好:你的类现在只在一个实例中清理东西;如果类被破坏时它们仍然存在。但是假设您有一个包含 10 个元素的 TidyVector foo,然后有人这样做了:

foo[5] = new int; // Memory leak!

或者

foo.resize(0); // Memory leak!

或者

foo.erase(foo.begin()); // Memory leak!

list 还在继续

关于c++ - 用于清理 vector 破坏的模板 - 怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/931225/

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