下午好,我们正在构建重复数据删除器的原型(prototype)。我们正在使用一个 STL 字符串数组来存储要删除的记录。该数组如下所示:
std::string* StringArray = new std::string[NumberDedupeRecords]
记录非常大,有160,000,000字节。当我们尝试在 std::string* StringArray
中存储要删除重复数据的记录的 std::string
版本时,STL 会对该字符串进行深度复制,并 mallocs a至少 160,000,000 字节的新缓冲区。我们很快就用完了堆内存并得到了一个 std::bad_alloc 异常
。是否有避免深拷贝和 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;
谢谢。
最佳答案
您可以简单地获取原始 std::string
的指针或引用 - 如果您发现有必要执行各种所有权策略,则包括智能指针。
关于c++ - 是否可以对非常大的 STL 字符串进行浅拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6063391/