C++未经处理的异常...stackoverflow(参数: 0x0000000000000001...)-- 分配大内存

本文主要是介绍C++未经处理的异常...stackoverflow(参数: 0x0000000000000001...)-- 分配大内存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天碰到一个问题

c++编译时一切正常,运行时出错

0x00007FF6925BE108 处有未经处理的异常(在 AutoProject.exe 中): 0xC00000FD: Stack overflow (参数: 0x0000000000000001, 0x000000E3CE403000)。

Unhandled exception at 。。。。。 : Stack overflow (parameters: 0x0000000000000001。。。。。

然后调试发现,是预定义的数组太大了,我这个数组只定义了大约1M

void write(){char writeBuffer[1048576];            // 1 MBytes....
}

如果要继续使用这样的大数组的话,当然可以根据new, delete来创建数组,

void write(){char writeBuffer* = new char[1048576];            // 1 MBytes....delete[] writeBuffer;
}

还有一种解决方式,尤其是函数调用频繁的时候,可以把该数组定义成全局变量,这样效率会比较高

char writeBuffer[1048576];            // 1 MBytes
void write(){    ....
}

第三种方法就是调整编译器的预定义设置,这种方式会对所有一起编译的项目都带来影响,所以通常情况不推荐这样做。

 

另外转一个别人的内存分配的帖子:

https://blog.csdn.net/czy47/article/details/80943740

C++中超大数组的空间分配

在C或者C++中,在函数(包括main函数)中定义数组,对于任何程序员来说都是so easy的事,当然这通常是对于一些容量小的数据;当我们有大量的数据需要处理的时候,比如1GB大小的数据,按照常规的方式在函数中定义数组空间,往往会运行出错,那么如何解决这样的问题呢?

在这里大家需要了解一点的是,C++中,在函数(包括main函数)中定义超大数组,内存为栈所分配的最大空间为4M,因此在子函数或者main函数中定义超大数组的方式是万万行不通的。

解决方式:为超大数组创建为一个全局数组。

有时候觉得数组使用起来不方便,可以采用定义vector的方式,但需要注意的是,vector通常只能分配出几百MB的空间。

vector <char> vec0;
vector <string> vec1;
vector <int> vec2;
vector <double> vec3;
 
cout<<vec0.max_size()<<endl;
cout<<vec1.max_size()<<endl;
cout<<vec2.max_size()<<endl;
cout<<vec3.max_size()<<endl;
//注意max_size()函数返回的是vector容器最大能存放的元素的个数,并不是字节数
 
在程序运行完之后得到的数据如下(win7系统  64位  VS2010下):

vec0 时为4294967295,即4G个元素

vec1 时为134217727,即128M个元素

vec2 时为1073741823,即1G个元素

vec3 时为536870911,即512M个元素

至于为何元素类型不同,返回的元素个数不同,我也不是很清楚,在这里给大家说一下。

此外,虽然上面显示了可以存放这么多数量的元素个数,但是一般情况下并不会真的让你存放这么多的数据。

由于vector在所需要的是一片连续的内存空间,有时候并不能实现,但是C++中 list 可以使用散列的空间,需要存放较大数据时可以使用 list 容器来存放数据。
 

这篇关于C++未经处理的异常...stackoverflow(参数: 0x0000000000000001...)-- 分配大内存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813538

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了