首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >堆栈上c++字符和字符串的内存分配

堆栈上c++字符和字符串的内存分配
EN

Stack Overflow用户
提问于 2014-09-15 12:35:04
回答 2查看 197关注 0票数 0

考虑以下职能:

代码语言:javascript
运行
复制
void Foo()
{
   std::string s = "Hello";
}

在上述情况下,字符串在哪里分配?有些页面(比如)说它在堆上,而微软说它取决于大小。如果我想避免使用new(),那么如何在堆和堆栈中确定这一点呢?

考虑另一个功能:

代码语言:javascript
运行
复制
void Foo2()
{
   char *c = "Hello";
}

在这种情况下,我假设它在堆栈上,但是当我通过MSVisualC++检查它的程序集时,我认为它就在堆上了。是真的吗?

char c[] = "Hello"在哪里?

我正在使用VC12,但我也想知道g++是怎么回事。

因为异常处理很重要。因为在展开堆栈的情况下,如果数据是在堆上创建的,那么数据就会丢失,另一方面,没有问题,但是堆栈可能太大了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-15 12:49:32

代码语言:javascript
运行
复制
void Foo()
{
   std::string s = "Hello";
}

执行受抚养人

如前所述,MSVC的标准库将分配给堆用于大字符串,本地存储(堆栈)用于较小的字符串。

它的存储方式将根据您使用的标准库的平台/版本而有所不同。存储不是在C++规范中定义的,只是功能。

代码语言:javascript
运行
复制
void Foo2()
{
   char *c = "Hello";
}

指针c位于堆栈上,但实际数据是只读的,而不是堆栈或堆中的数据。

它实际上存储在内存中的只读数据块中。

代码语言:javascript
运行
复制
void Foo3()
{
   char c[] = "Hello";
}

数组c存储在堆栈上。初始化它时,使用与Foo2()中相同来源的字符串"Hello“创建它。但是,由于c在堆栈中,*c指向可以修改的数据。

票数 0
EN

Stack Overflow用户

发布于 2014-09-15 12:50:49

std::string管理自己。在守则中:

代码语言:javascript
运行
复制
void foo() {
    std::string s = "Hello";
}

s是堆栈变量。如何存储字符串"Hello"取决于您不需要担心它--除非您的特定STL实现是错误的,否则一切都会得到解决。

在:

代码语言:javascript
运行
复制
void bar() {
    char* c = "Hello";
}

您已经声明了指向文本字符串"Hello"的本地指针。这取决于编译器的去向,但很可能是在内存的只读段中。值得注意的是,在本例中,字符串"Hello“在C++98中是一个常量,试图修改它在技术上是不可取的(我相信C++11中有一个彻底的错误)。

在:

代码语言:javascript
运行
复制
void baz() {
    char c[] = "Hello";
}

整个字符串"Hello";存储在本地的6个元素字符数组中(即在堆栈上)。

在大多数情况下,使用std::string的解决方案更可取。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25848264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档