【问题标题】:Large memory size allocation to a buffer of type int为 int 类型的缓冲区分配大量内存
【发布时间】:2013-07-26 10:50:59
【问题描述】:

我正在做一个可视化 c++ 应用程序并尝试为缓冲区分配大小(该缓冲区进一步用于存储流的内容)。 如果声明为缓冲区的大小小于则没有问题

const int size= 319000; //here there is no problem

但是为了从流中访问我想要的一些数据,我需要像这样声明大小的缓冲区-

const int size=4348928;//this size cause the problem
char buffer[size+1];
HRESULT hr = pStream->Read(buffer, size, &cbRead );

虽然代码的最后两行对我的问题没有任何作用,但它只是让您了解我究竟在用这个缓冲区的大小做什么。

但是当我声明这个大小时,它什么也不做(我的意思是我的可视化应用程序功能是这样的:如果你点击一个文件,它会生成一个流,我将该流存储在缓冲区中 - 如果我声明订单的大小319000 个程序运行良好,当将大小增加到 4348928 时,它甚至都不起作用——当然没有错误)

【问题讨论】:

    标签: c++ types buffer buffer-overflow


    【解决方案1】:

    如果buffer 是一个局部变量,那么你尝试在堆栈上分配数组。堆栈通常在低兆字节范围内(如一到四)。您尝试分配 超过 4 MB,但这是行不通的。

    解决这个问题的简单方法是在堆外动态分配它:

    char* buffer = new char[size + 1];
    
    // Do operations on `buffer`
    
    delete[] buffer;
    

    【讨论】:

    • @huseyintugrulbuyukisik 是的,但是它为整个进程设置了堆栈,仅仅因为一个函数而增加堆栈可能是浪费。
    • 或者只是一个vector,它具有异常安全的明显优势。
    • @ShekharSinghSHEKHAWAT 4348928 字节为 4.1 MB,您还需要空间用于所有其他变量、参数,当然还有调用链中的 previous 函数(及其变量)。更不用说编译器(可能还有硬件)也会将数据放入堆栈。
    • @ShekharSinghSHEKHAWAT 如果您之后继续执行该程序,那么您有内存泄漏。
    • +1,@JoachimPileborg,我一直在寻找为什么堆栈大小受限的解释。所以谢谢。你能指点一下我在哪里可以获得更多关于这方面的信息吗?
    【解决方案2】:

    您会遇到这种情况,因为静态数据存储在堆栈中,其大小为几 MB。如果您动态分配内存,您的数据会进入堆,并且会更大。

    在你的情况下,我会使用容器。应该是vector

    std::vector<char> buffer(size);
    

    容器比指针更安全,比动态分配更安全,因为如果你不再使用容器,容器会自动删除内容。此外,您始终可以安全地增加容器的大小,只需推动另一个值。

    如果你需要将它传递给函数,你可以传递引用(这可能是最好的选择),但是你可以通过这样做将指针传递给第一个元素:&amp;buffer[0] (这只适用于vector )

    此外,您还可以通过获取指向数据的指针来遍历所有容器。

    for (std::vector::iterator it = buffer.begin(); it != buffer.end(); ++it)
    {/*some stuff*/}
    

    迭代对于任何类型的容器看起来都是一样的。

    更重要的是,您分配了 4348928 个字符,大约是 4MB。但是如果你需要分配 300MB 分配 new 通常会失败(与 vector 相同)。对于如此大的分配,您应该使用std::deque

    【讨论】:

      【解决方案3】:

      使用指针,因为本地函数内存是从堆栈分配的,它将无法获取那么多。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-09
        • 1970-01-01
        • 1970-01-01
        • 2016-03-09
        • 1970-01-01
        • 2023-03-15
        • 2014-05-30
        相关资源
        最近更新 更多