C++ std::string 内部内存处理

标签 c++ string memory-leaks

<分区>

我对 std::string 如何处理它的复制(?)内存感到困惑。

当我尝试这样做时:

char* abc = new abc[512];
abc = "abcdef";
std::string tempstr(abc);
tempstr[0] = 'Y';
std::cout << tempstr.c_str() << std::endl;
std::cout << abc << std::endl;

我得到以下输出:

Ybcdef
abcdef

但如果我尝试释放由 new 分配的内存,则在末尾添加:

delete [] abc;

我收到内存错误 (_BLOCK_TYPE_IS_VALID) 现在我的问题是,这怎么可能? String 似乎复制了 abc 的数据,使其保持原样,但由于某种原因,我无法删除它。

我问这个,因为我的代码中有以下情况:

char* somestring = new char[1024];
// something happens to somestring here
stack.push_back(somestring); // stack is a vector of strings

我想知道我应该在哪里释放由 somestring 分配的内存。

最佳答案

char* abc = new abc[512];
abc = "abcdef";

这两个语句导致了内存泄漏,abc 不再指向动态内存,而是指向只读内存中的字符串文字。所以当你打电话时:

delete [] abc;

您实际上是在一个不指向动态分配内存的指针上调用 delete,这会导致未定义的行为,并且可能会出现段错误。

abc = "abcdef";

不会将字符串复制到分配给 abc 的内存中,而只是将 abc 重新设置为指向字符串文字。为了能够将字符串复制到为 abc 分配的内存中,您需要使用 std::copystrncpy

关于C++ std::string 内部内存处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18428987/

相关文章:

java - Jetty webapp 继续增长到堆空间 : (OutOfMemoryError Java heap space)

c++ - 类中的嵌套类或结构

c++ - 使用常用数学函数 exp() log() 时如何防止溢出?

string - golang 扫描字符串或整数

c# - 使用正则表达式替换引号外的空格

javascript - 使用 Promise 而不拒绝它会导致内存泄漏吗?

c++ - 如何在给定指向它的指针的情况下从 vector 中删除元素 - C++

c++ - size_type 和 multi_array 索引的 Boost 有符号/无符号比较

c - scanf 如何处理空白区域?

c++ - 堆密集型 C++ 程序