是否可以制作非常大的STL字符串的浅表副本?

Fra*_*ank 1 c++ linux windows stl

下午好,我们正在构建一个重复数据删除器的原型.我们使用一组STL字符串来存储要删除的记录.该数组如下所示:

std::string* StringArray = new std::string[NumberDedupeRecords]
Run Code Online (Sandbox Code Playgroud)

记录非常大,大到160,000,000字节.当我们尝试存储std::string要在其中重复删除的记录版本时std::string* StringArray,STL会对字符串进行深层复制,而malloc则会创建一个至少160,000,000字节的新缓冲区.我们很快耗尽堆内存并得到一个std::bad_alloc exception.是否有解决方法来避免深层复制std::bad_alloc?也许我们应该使用一个新的数据结构来存储std::string要删除的记录,或者我们应该保存它们auto_ptr.

我们在这里显示一个代码片段:

std::string clara5(curr.getPtr()); 
char* const maryptr = (curr.getPtr() + n - curr.low()); 
maryptr[54] = '\x0'; 
StringArray[StringArrayCount] = clara5; 
curr.mPtr = (char*)StringArray[StringArrayCount].c_str(); 

std::multiset<Range>::iterator miter5 = ranges_type.lower_bound(Range(n));
(*miter5).mPtr = curr.mPtr; StringArrayCount += 1;
Run Code Online (Sandbox Code Playgroud)

谢谢.

Pup*_*ppy 5

std::string如果您发现有必要强制执行各种所有权策略,您可以简单地获取原始指针或引用- 包括智能指针.

  • 我认为通过`boost :: shared_ptr`s(或等效的)访问这些字符串将是最好的方法. (2认同)