【问题标题】:c++ : string constructor with char* memory leakc ++:带有char *内存泄漏的字符串构造函数
【发布时间】:2014-08-23 06:47:15
【问题描述】:

根据我的理解,当我们用char* 调用string ctor 时发生深度复制,因此在构造函数调用字符串后,传递的char* 可以很容易删除 (是吗?)之后可以安全地使用新字符串。

char* cptr = new char[20];
cptr = "dynamic_cstring"; // will it make difference if i will use memset

std::cout << cptr << std::endl;

std::string str(cptr);

std::cout << str.c_str() << std::endl;

cptr = "another string"; // seems that string internal buffer is not pointing to cptr

std::cout << str.c_str() << std::endl;

delete[] cptr; // crashed at this line. why ?

当我使用 char* 初始化字符串时,如何防止内存泄漏?还是自动清洗?如果我使用类似的东西怎么办:

cptr[0] = 's';

std::string str(cptr);

// cptr = "another string"; 

delete[] cptr;

这种情况下需要删除吗?

【问题讨论】:

  • cptr = "dynamic_cstring"; 并不像你想的那样。
  • 您的 cout 语句中不需要 str.c_str()。此外,您可以使用std::strnig str = "My string"; 直接初始化您的字符串。话虽如此,如果可能的话,最好避免使用任何 char*。

标签: c++ string pointers memory-leaks


【解决方案1】:
cptr = "dynamic_string"

这会将作为地址的char* 值更改为指向字符串文字。字符串文字驻留在组装文件的数据段中,不是动态分配的。所以你不能delete它。

分配指向另一个地址的指针永远不会复制数据,您应该使用strncpy 有效地复制内容(或逐个设置字符)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2021-06-17
    • 2013-01-12
    相关资源
    最近更新 更多