gpt4 book ai didi

c++ - 在 C++ 中的堆中删除从 Char[] 创建的堆上的字符串

转载 作者:行者123 更新时间:2023-11-28 07:27:44 25 4
gpt4 key购买 nike

我有一个相当简单的问题,我似乎无法找到与 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 的底层实现只维护一个指向字符缓冲区的指针,并且在销毁时释放 that 指针,但我不确定,我的 C++ 充其量是生锈的.

额外的问题:如果所讨论的类不是 std::string,这将如何改变?我假设对于任何用户创建的类,实现者必须提供一个显式析构函数,但是其他各种标准类呢?假设删除父对象总是足以完全破坏一个对象是否安全(我在这里尽量谨慎选择我的话;我知道在某些情况下不希望释放对象指向的内存,但这超出了这个问题的范围)?

最佳答案

std::string 可以从 C 风格的空终止字符串 (const char *) 初始化。 std::string 无法知道您是否需要 const char * free()d, delete[] ()d 或两者都不是,如前所述,它不会。

使用智能指针自动删除动态分配的对象。其中有一些不同的,每个都专门用于特定目的。看看 scoped_ptrauto_ptrshared_ptr。您的项目可能会限制您使用哪些智能指针。

在 C++ 的上下文中,没有理由将字符串保存在手动声明的 char 数组中,std::string 使用起来更安全。

关于c++ - 在 C++ 中的堆中删除从 Char[] 创建的堆上的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18411299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com