【问题标题】:STL container for BIG (>13MB) structure用于 BIG (>13MB) 结构的 STL 容器
【发布时间】:2013-08-08 15:49:45
【问题描述】:

我目前有一个非常大的结构 >13MB(它必须保持这样,因为我没有指针)。我的问题是如何将它存储到一个类中。

如果它是课程的一部分,我会得到 stackoverflow。如果我使用指针,问题就解决了,直到我需要开始复制类......然后地狱开始了。 (因为类有很多成员)。

我尝试了 STL 向量和数组,但我仍然得到了 stackoverflow。是否有任何不将结构放入堆栈但直接分配内存的 STL 容器?

这样我就可以把所有事情都做好了。

谢谢。

更新:

示例代码:

//HEADER
#include <vector>
struct BigStruct { //This is untouchable or divisible into an array of arrays
    char a[1000];
    int b[1000][1000];
    long c[1000000];
    // etc...
};

class Foo
{
    std::vector<BigStruct> a; //It has to be here since is related to this instance of the class

public:
    Foo();
    //All the other funcs and method
    // ...

    //All the other variables are from STL
    // ...
};

//CPP
Foo::Foo(){
 a.resize(1);
}

【问题讨论】:

  • std::vector 在堆上分配,你不应该得到堆栈溢出。
  • 请记住,堆栈通常只有几 MB,因此如果将其声明为局部变量,那么您肯定会发生堆栈溢出。
  • 如果它是 15mb,并且您将它用作普通类,您可以将其用作堆栈上的局部变量,并继续将它从一个地方复制到另一个地方......你有一个真正的设计问题。
  • 您可能正在堆栈上创建此结构的临时实例,从而导致溢出。请提供您如何插入向量的代码。
  • vector&lt;unique_ptr&lt;T&gt;&gt; 怎么样?你不需要有复制行为。

标签: c++ stl stack-overflow


【解决方案1】:

我只是在回答我自己的问题。调用resize()时,std::vector 在堆栈中创建了一个BigStruct 类型的元素,然后按照指定的次数复制它。

可以通过像这样在向量中创建元素来避免这种行为:

Foo::Foo(){
 BigStruct * temp = new BigStruct;
 a.clear();
 a.push_back(*temp); //Element is reserved and copied directly from temp.
 delete temp;
}

这完全解决了堆栈问题,并允许父类的可移植性(复制,移动销毁)。

【讨论】:

  • 并且每次泄露13MB内存。不过,堆内存,所以你的堆栈问题确实解决了。
  • 哦,是的,我最后需要删除临时文件。对不起。
  • 我会使用智能指针,但仍然存在泄漏,但前提是 .push_back 抛出。
猜你喜欢
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多