C++ 全局结构是在堆栈上还是在堆上分配的?
我在一个环境中写作,在这个环境中,我不允许在程序启动后分配新内存,也不允许进行操作系统调用。在跟踪页面错误时(可能是由于无意中违反了上面的一个错误而引起的),我遇到了一个问题(因为这让我在std字符串的屁股上咬了一口) 是否在堆栈或堆上分配了全局/本地结构?例如: 如果此语句在全局范围内C++ 全局结构是在堆栈上还是在堆上分配的?,c++,struct,C++,Struct,我在一个环境中写作,在这个环境中,我不允许在程序启动后分配新内存,也不允许进行操作系统调用。在跟踪页面错误时(可能是由于无意中违反了上面的一个错误而引起的),我遇到了一个问题(因为这让我在std字符串的屁股上咬了一口) 是否在堆栈或堆上分配了全局/本地结构?例如: 如果此语句在全局范围内 struct symbol { char blockID; int blockNum; int ivalue; double fvalue; int referenc
struct symbol {
char blockID;
int blockNum;
int ivalue;
double fvalue;
int reference;
bool isFloat, isInt, isRef;
int symbolLength;
} mySymbol;
内存分配的内存在哪里?
它是实现的定义(C++标准并没有真正讨论栈和堆)。 通常,具有静态存储持续时间的对象(例如globals)最终将位于一个既不是堆栈也不是堆的特殊地址空间段中。但具体的内容在平台上有所不同。C++中的< P>,与C语言不同,struct
是默认可见性为public的类。是在堆栈上还是在堆中执行分配取决于您分配实例的方式
class A;
void f()
{
A a;//stack allocated
A *a1 = new A();// heap
}
我可能是在抓救命稻草,但我正试图解决一个相当令人恼火的问题,想法也快用完了。既不在堆上,也不在堆栈上,而是在全局对象的内存中。顺便说一句,你可以用一个大的全局对象创建自己的堆。将其与自定义的std::allocator
相结合,您就可以安全地使用std::string
,std::vector
,等等。您是否考虑过覆盖::operator new
以断言、异常或使用静态分配的池?@deft\u code`@Mooing Duck我没有考虑这些可能性,但我会考虑使用它们。谢谢我不认为会以任何特殊的方式处理它们,但我想确信后台不会发生内存分配。如果对象是在函数范围内声明的,它会出现在堆栈上吗?@Stephen:是的。非静态局部变量(更正式地说,是具有自动存储持续时间的变量)出现在堆栈上