我正在寻找一种方法将大数据数据(存储在一个类中,包含对数据,大小等检查等基本功能)存入任何STL容器,如向量或队列(FIFO队列最好,因为我有生产者和消费者。)
问题是我必须实现复制构造函数而且......好吧..我不想做一个深层复制(因为它花了太多时间,所以我坚持浅拷贝),但是又一次我有一个问题就是不知道何时删除析构函数中的数据数组(因为我将析构函数调用两次并且只有数据一次,而且,对析构函数的第一次调用可能来自插入/移动容器中的元素,所以我仍然需要那时的数组数据。)
我考虑过使用像std :: shared_ptr这样的智能指针作为数据数组,但是从我读过的它们不会调用delete []而是删除 - 这是一种耻辱,因为我有一个普通的数组[]。
现在我有一个解决方案,在从容器中删除之前,手动调用类上的“DeleteArray”函数。它工作得很好但是......它不是很好。
有什么想法吗?
答案 0 :(得分:3)
Boost有一个shared_array
类,类似于shared_ptr
,但会使用delete[]
,或者您可以向shared_ptr
添加一个自定义删除器,使其调用delete[]
}}
答案 1 :(得分:1)
请勿使用数组,而是使用std::vector
。然后用智能指针指向它。
答案 2 :(得分:1)
更好的解决方案是将shared_ptr
放入容器中的大型对象,并避免昂贵的副本。
当然,另一个选择是使对象本身具有轻量级并可使用shared_array
进行复制。正如耶利米所暗示的那样。
答案 3 :(得分:0)
数组有一个shared_ptr
等价物,至少在Boost库中是这样。它被称为shared_array
,它的行为完全符合您的预期。查看http://www.boost.org/doc/libs/1_45_0/libs/smart_ptr/shared_array.htm?sess=8940ad57baa307d68cb2e7fd2939d2db上的规范。
答案 4 :(得分:0)
您可以在复制构造函数中实现简单的引用计数。您可以在每次删除时减少参考。
答案 5 :(得分:0)
非常感谢你所有有见地的答案!
这让我想起为什么上次我遇到这个问题时,我手动编码队列而不复制自己。我不能说我花了很长时间才弄清楚如何做出漂亮,干净的版本。 :)
所以..我做的是:
解决方案a) 就像在原始帖子中描述的那样,我创建了一个必须在从向量中删除类之前显式调用的函数。不太好但是效果很好而且我没有其他任何东西搞乱,只记得给它打电话。
解决方案b) 我把数组放在另一个类中,并使用smartpointer(shared_ptr)到该类。工作得很好。我不得不使用shared_ptr作为向量的元素。 (起初我没有想到这一点。)
解决方案c) 使用shared_ptr来保存数组。事实证明是非常糟糕的主意,因为它调用了delete而不是delete [],你需要提供自定义删除器,并且不知何故出现了一些其他(语法)问题,所以它花了我2h +这样的解决方案。
在头文件中看起来像这样:
template< typename T >
struct
array_deleter
{
void
operator ()( T const * p)
{ delete[] p; }
};
class MemoryStressChunk
{
private:
int chunkSizeInValues;
std::shared_ptr< __int64 > data;
};
并在代码文件中:
data.reset(
new __int64[chunkSizeInValues],
array_deleter< __int64 >() );
并且要使用它我必须再次出来:
__int64 *d = data.get();
下次我可能会强烈考虑使用升级版本。我没有在我的机器上提升,所以这就是为什么它不适合我。
我接受了 解决方案d)将使用包含shared_ptr的类的向量到向量(而不是数组)。在我获得所有的乐趣之后c)我没有在顶部做到这一点。 :)
如果有人想查看代码,可以在此处http://andreas-reiff.de/wp-content/uploads/2011/01/Tool-MemTester.zip获取。请注意,版本a)中可能存在memleak(在版本b中使用类的shared_ptr))。
再次获得所有帮助!