C++ Operator + string long产生Segmentation Fault

Tun*_*ble 2 c++

以下代码仅生成xxx行(即"pre concat"之前)产生分段错误.

cerr << "xxx + " << ((long long) timev);
string cname = "MyKey" + ((long long) timev);

string operator+(const string& str, long long nr) {
  cerr << "Pre concat "; // << str << "$" << nr;
  stringstream ss;
  ss << str << nr;
  cerr << "Post concat";
  return ss.str();
}
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?

(我将使用一种方法,在标准类型上重载运算符可能是一个坏主意,因为它可能与其他模块冲突.但是,如果我能看到这有什么问题,该死的.)

son*_*yao 6

"MyKey"不是std::string.是的const char[6].因为"MyKey" + ((long long) timev),您的重载运算符将不会被调用.相反,"MyKey"会腐烂const char*,然后"MyKey" + ((long long) timev)可能会超出数组的界限,即 UB.

代码等同于:

const char* key = "MyKey";
string cname = key + ((long long) timev); // or key[((long long) timev)]
Run Code Online (Sandbox Code Playgroud)

你可以

string cname = string("MyKey") + ((long long) timev);
Run Code Online (Sandbox Code Playgroud)