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

Mac*_*zik 1 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;
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Ybcdef
abcdef
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试释放new分配的内存,最后添加:

delete [] abc;
Run Code Online (Sandbox Code Playgroud)

我收到内存错误(_BLOCK_TYPE_IS_VALID)现在我的问题是,这怎么可能?字符串似乎复制abc的数据,保持不变,但由于某种原因,我无法删除它.

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

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

我想知道我应该在哪里释放由某些字符串分配的内存.

Alo*_*ave 5

char* abc = new abc[512];
abc = "abcdef";
Run Code Online (Sandbox Code Playgroud)

使用这两个语句只会导致内存泄漏,并且abc不再指向动态内存,但它指向放置在只读内存中的字符串文字.所以当你打电话时:

delete [] abc;
Run Code Online (Sandbox Code Playgroud)

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

abc = "abcdef";
Run Code Online (Sandbox Code Playgroud)

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