string a("aaaa");
string b;
b = a;
const char* p1 = a.c_str();
const char* p2 = b.c_str();
if (p1 == p2) printf("true"); else printf("false");
falsetrue| 平台 / 標準庫 | C++98/03 | C++11 起 |
|---|---|---|
| GCC libstdc++ (舊版) | 啟用 COW | 預設關閉 (可用 -D_GLIBCXX_USE_CXX11_ABI=0 強制開啟) |
| MSVC STL | 從未啟用 COW | 從未啟用 COW |
| Clang libc++ | 從未啟用 COW | 從未啟用 COW |
operator[]、push_back、append)時,若引用計數 > 1,才真正分配新記憶體並拷貝數據(寫時拷貝)。char* p = const_cast(b.c_str()); // 強制轉型
p[0] = 'b'; // 直接修改共享緩衝區!
a 也會變成 "baaa",引發難以排查的 Bug。b 已是獨立副本,a 不受影響。鐵律: 永遠不要 const_cast 修改 c_str()/data() 返回的指標。
a == b 或 a.compare(b)。std::string_view (C++17) 避免拷貝,或 reserve() 減少重分配。-D_GLIBCXX_USE_CXX11_ABI=0,但需承擔 ABI 不兼容風險。Linux/GCC 舊版預設 COW 導致 c_str() 指標相同;Windows/MSVC 從不 COW,指標必異。現代 C++ (C++11+) 統一採用 SSO + 深拷貝,消除了該差異。寫可移植代碼時,**切勿依賴實現細節,嚴守標準語義**。