删除Char []中创建的堆上的字符串一个C ++中的堆

时间:2013-08-23 20:27:36

标签: c++ pointers memory-management stdstring

我有一个相当简单的问题,我似乎无法找到与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,会如何改变?我假设对于任何用户创建的类,实现者必须提供显式的析构函数,但是其他各种标准类呢?是否可以安全地假设删除父对象总是足以完全破坏对象(我试着在这里仔细挑选我的话;我知道有些情况下不希望释放对象指向的内存,但这超出了这个问题的范围)?

1 个答案:

答案 0 :(得分:1)

std::string可以从C样式的以null结尾的字符串(const char *)初始化。 std::string无法知道您是否需要const char * free() d,delete[]() d或两者都没有,而且如前所述,它不会。

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

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