c++为什么在将字符串文本传递给函数时会分配内存
c++ Why is memory allocated when passing a string literal to a function?
我有他的代码:
int setAttrib(const string& name, int components){
// here I don't even touch 'name'
if(components == 2) return 3;
else return 1;
}
我这样调用函数:
setAttrib("position", 3);
我正在使用xcode探查器分析内存,在函数调用std::string中进行分配
为什么?
编辑:
避免这种分配的最佳方法是什么?因为我经常调用这个函数,在大约10秒内,我最终在该行中分配了大约10MB。
谢谢。
您请求const string&
,但传入const char*
。因此,编译器需要创建一个正确类型的临时对象。
"position"
不是std::string
而是char const*
这一事实与其说是一个设计决策,不如说是一次历史事故(继承自C,当时C++中没有string
类),但还是要记住这一点。
因为std::string
通常会分配堆内存来保存字符串。在这种情况下,std::string
是由字符串文字(其本身位于静态存储中)隐式构造的。有些字符串实现使用小缓冲区来提供小字符串,但这里的情况似乎并非如此,而且无论如何都依赖于实现。
不使用name
并不重要——基本上,setAttrib("position", 3)
是setAttrib(std::string("position"), 3);
的缩写,所以当控件进入setAttrib
时,内存已经分配好了(当然,在您的独立代码示例中,编译器可以内联getAttrib
,然后完全放弃字符串构造,但这是编译器的优化,而不是语言功能)。
请注意,在函数调用期间创建的临时对象在函数返回时会自动销毁,因此不会泄漏内存。
为了调用函数,编译器需要构造所有参数,包括const string& name
,在您的情况下,唯一的方法(而是传递字符串文字)是构造临时std::string
,这在大多数实现中需要堆内存分配。是否在函数中使用该值并不重要。
- 从构造函数抛出异常时如何克服内存泄漏
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- std::unordered_map析构函数不释放内存?
- 从构造函数内存泄漏引发异常
- C++函数:内存访问次数
- 运算符过载、析构函数内存泄漏
- 测量cpp中的函数内存使用情况
- C++:链表析构函数内存泄漏
- C++图形函数内存泄漏(valgrind在线上没有具体说明)
- 成员函数内存分配堆栈或堆
- 构造函数 - 内存分配失败
- System::字符串到char*函数.内存泄漏
- 使用std::swap的C++函数内存泄漏
- 错误:malloc():排序的比较函数内存损坏
- 函数内存不足-我该怎么办
- c++析构函数内存泄漏
- 将双精度转换为字符串函数-内存问题
- 常量迭代器的矢量构造函数内存分配,seg错误
- c++函数内存对齐