编译器的堆空间不足
‘壹’ c++中为什么有些变量在编译是就由编译器分配了内存空间,还没有运行怎么会占用内存呢
还没有运行怎么会占用内存呢?!(这一点还要怀疑吗!?)
所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段中,不必在程序运行期间用额外的代码来产生这些变量。
其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称,类型,作用域,生存期等等),对应的只是一块内存(只有首址和大小),所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了; 写delete表示这块内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码而言变量是给内存块起了个名字,用以区分彼此)
内存申请和释放时机很重要,过早会丢失数据,过迟会耗费内存。特定情况下编译器可以帮我们完成这项复杂的工作(增加额外的代码维护内存空间,实现申请和释放)。从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用到了我们常常挂在嘴边的堆和栈这两种数据结构。
最后对于“编译器分配空间”这种不严谨的说法,你可以理解成编译期间它为你规划好了这些变量的内存使用方案,这个方案写到可执行文件里面了(该文件中包含若干并非出自你大脑衍生的代码),直到程序运行时才真正拿出来执行!
‘贰’ QT编译器的堆空间不足是什么意思
你说的是手机RAM还有3G,手机提示安装空间不足是指你的手机闪存不够了,试着把手机里的应用能转到手机ROM内存(就是一般说的手机内存)里。试试看行不行。希望能帮到你
‘叁’ 很多书上面写,堆空间中的内存如果不释放掉,就永远不可被别的变量占用,那么这个永远是指多久
C++编译器会为每个类自动生成一个默认的构造函数、析构函数、赋值函数、拷贝构造函数,这当然是在你没有为你的类声明这些函数的时候。这些默认的功能函数在为你提供方便的时候,也会给你带来麻烦。
例如:
class string {
public:
string(const char *value);
~string();
... // 没有拷贝构造函数和operator=
private:
char *data;
};
string::string(const char *value)
{
if (value) {
data = new char[strlen(value) + 1];
strcpy(data, value);
}
else {
data = new char[1];
*data = '\0';
}
}
inline string::~string() //注意:new 和delete 要采用相同的形式。
如果有string的两个对象,
string a("hello");
string b("world");
当b=a时,因为你自己没为类定义那些函数,所以C++编译器会提供默认的赋值函数,这个缺省的赋值操作符会执行从a的成员到b的成员的逐个成员的赋值操作,对指针(a.data和b.data) 来说就是逐位拷贝。这种情况下至少有两个问题。
第一,b曾指向的内存永远不会被删除,因而会永远丢失。这是产生内存泄漏的典型例子。
第二,现在a和b包含的指针指向同一个字符串,那么只要其中一个离开了它的生存空间,其析构函数就会删除掉另一个指针还指向的那块内存,重复析构的问题。
下面的语句:
string a("hello"); // 定义并构造 a
{ // 开一个新的生存空间
string b("world"); // 定义并构造 b
...
b = a; // 执行 operator=, 调用默认赋值函数
// 丢失b的内存,造成内存泄露。
} // 离开生存空间, 调用
// b的析构函数
string c = a; // c.data 的值不能确定! 调用默认的拷贝构造函数
// 但是a.data 已被删除,无法进行拷贝构造。
‘肆’ 用c语言随机生成数据,由于数组规模较大,空间不足,程序无法运行怎么办
是有这么一个规定的,堆一次申请,空间大小是2M,受编译器和操作系统的限制。
如果没办法更换系统和编译器,可以边申请,边写到硬盘上,比如写入一个文件。
‘伍’ 程序设计中,堆和栈比较重要。栈存取速度大于堆,而且编译器可以修改栈大小,这个值可以随意设置吗
学习电脑编程多年了,在程序设计方面也算有一番见解,希望这些经验能对题主有所帮助。
现在堆栈通常默认为8M,对吧?事实上,如果你不滥用递归,或者alloca / vla,大多数时候,就足够了。即使它不超过内核限制,通常也不适合驱动大型的,或者它会影响并发进程的数量。并且过程启动时间也应该稍微减少。当然,如果是专用的服务器系统,问题就不严重了。
‘陆’ VC中堆溢出,请问如何在编译器中设置堆的大小小
这不是在编译器里设置的问题.
溢出是因为你在指针中开辟的空间太小.比如你设置了一个数组个数是5,你要往里面放6个数,就会溢出了.堆栈也是一样的.可能是你设置不对.仔细检查一下.
‘柒’ 请问VC6。0怎中么指定编译器堆空间大小
Determines the compiler's memory allocation limit for the precompiled header.
/Zmnumber
The number argument is a scaling factor with a default value of 100, which specifies a memory allocation of 50 MB. The maximum value is 2000. The following table shows how number modifies the memory allocation.
Value Memory allocation
10 5.0 MB
100 50 MB
200 100 MB
1000 500 MB
2000 1000 MB
不过这种情况应该是你的算法有问题吧?
‘捌’ 为什么打开电影提示内存不够编译器错误啊
这是系统提示:
可用内存不足。
错误
ID:BC2004
(也就是说,你在播放电影的时候,由于其他进程正在运行,占用了内存,剩余资源无法支持电影播放)
防止此情况,你可以试着进行以下操作:
关闭不必要的应用程序、文档和源文件。
消除不必要的控件和窗体,以便同一时间加载较少的控件和窗体。
减少
Public
变量的数目。
检查可用的磁盘空间。
请通过安装更多的内存或重新分配内存来增加可用
RAM。
确保不再需要内存时释放内存。
‘玖’ C语言中malloc分配内存空间不足, 但是还是能放,为什么呢
这说明你比较幸运,没有出现程序崩溃。
首先在堆栈申请的内存,后面也许还是没有别的程序在用,所以你的程序超过你申请的内存也不会出现问题;
但是如果有别的程序已经占用了你申请内存的后面空间,你再用就会出现无法写入,程序崩溃。
‘拾’ “编译器”如何设置内存区域
不是.
编译好后的exe文件并非只有代码部分,还有其他的部分如数据部分以及其他.其中包括诸如内存如何分配,堆栈如何处理等等的描述.而这些描述就是编译器写进exe文件里的.
如果想知道的详细些,可以简单的看一下关于PE结构的描述~~