下面的代码以free(): double free detected in tcache 2. 我想知道错误发生的内部过程。
#include <string>
class test
{
private:
std::string member;
public:
test(const std::string & arg) { member = arg; };
};
int main()
{
test T = test("test test test test");
T.~test();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误取决于给定字符串的长度;如果您更改"test test test test"为"test",则程序运行良好,至少g++在我的计算机上是这样。
std::string有一个用于短字符串的内部缓冲区,以避免内存分配。如果字符串很短,则没有可释放的内存并且它可以工作。如果字符串很长,它会在每次调用析构函数时尝试释放缓冲区。
以下是有关短字符串优化的更多信息: std::string 上下文中首字母缩略词 SSO 的含义