【发布时间】:2013-08-27 00:07:13
【问题描述】:
我有一个相当简单的问题,我似乎找不到与 C++ std::string 相关的答案以及它是如何用 new 实例化的。现在,我很清楚从 new 返回的任何指针都应随后删除以防止内存泄漏。我的问题来自于随后使用现有指针实例化新字符串对象时会发生什么。请考虑以下简化示例:
char* foo() {
char* ptr;
ptr = new char[ARBITRARY_VALUE];
...
ptr = strncpy("some null terminated string", ARBITRARY_VALUE)
...
return ptr;
}
int main() {
char* buf;
std::string myStr;
buf = foo();
myStr = new std::string(buf);
...do stuff
delete myStr;
delete buf; //Is this necessary?
return 0;
}
我的问题很简单:删除 myStr 是否也会释放 buf 使用的底层内存,还是 buf 也需要手动释放? 如果 buf 必须手动释放,会发生什么情况匿名参数?如:
myStr = new std::string(foo());
我的怀疑是 std::string 的底层实现只维护一个指向字符缓冲区的指针,并且在销毁时释放 那个 指针,但我不确定,我的 C++ 充其量是生锈的.
额外问题:如果所讨论的类不是 std::string,这将如何改变?我假设对于任何用户创建的类,实现者必须提供显式析构函数,但是其他各种标准类呢?假设删除父对象总是足以完全破坏对象是否安全(我在这里尝试仔细挑选我的话;我知道在某些情况下不希望释放对象指向的内存,但这超出了这个问题的范围)?
【问题讨论】:
-
myStr = new std::string(buf);不是有效代码。除非你打错了,myStr是std::string*。 -
请阅读并遵守它:klmr.me/slides/modern-cpp/#1
-
是的,你需要删除
buf,因为std::string复制了它所指向的数据,原来的内存还在。不过,您可以使用delete[] buf;。 -
在
myStr = new std::string(foo());内存泄露的情况下。 -
请永远不要(!)返回分配的指针。除非它是分配器函数。
标签: c++ pointers memory-management stdstring