C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – vector正在抛出bad_alloc大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码抛出std :: bad_alloc异常:

std::vector<std::vector<double>> myVector(nlines);
    for(int i = 0; i < nlines; i++)
    {
        try
        {
            std::vector<double> iVector(ncolumns);
            myVector[i] = iVector;
        }
        catch (std::exception& E)
        {
            /* catches a bad_alloc here */
        }
    }
}

当nlines大约为500,000(ncolumns通常小于10)时,此代码似乎有效,但当我在Nlines = 2,600,000的全尺寸数据集上尝试此操作时,我得到bad_alloc异常.

我有12 GB的内存并在运行程序时查看我的内存使用情况,它从28%(开始之前)上升到42%(抛出异常时).所以看起来我还有可用的内存.

我发现this post表示向量在堆上分配内存.根据链接this MSDN pagethis post,我可以设置我的代码可以使用的堆的数量(以字节为单位).最初,堆提交大小和堆保留大小为空白.当我输入2000000000(2 GB)的值时,我仍然遇到同样的问题.

为了使事情变得更有趣,使用来自C#.NET应用程序的互操作来调用此C代码(而不是CLI).对堆项目大小和堆保留大小的修改是在C项目上设置的.我不知道我是否还需要在.NET项目上设置这些或者我将如何设置它们.

任何建议或帮助将不胜感激.

解决方法

正如Neil Kirk指出的那样,如 this MSDN page所述,32位进程限制为2GB内存.对于无人管理和托管应用程序也是如此.

关于这个有很多SO问题,例如我发现了这些:

How much memory can a 32 bit process access on a 64 bit operating system?

The maximum amount of memory any single process on Windows can address

Set Maximum Memory Usage C#

在我的情况下,我认为.NET和非托管代码间的互操作正在进行一些缓冲,因此占用了可用内存.理想情况下,我应该只有两个或三个2,000 x 10个元素的2D向量(如果一个双精度是8个字节,那么这仍然小于1 GB).我需要进一步调查.

大佬总结

以上是大佬教程为你收集整理的c – vector正在抛出bad_alloc全部内容,希望文章能够帮你解决c – vector正在抛出bad_alloc所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。