2016-11-16 69 views
-2

以下示例中,我将fn作为指向常量c字符串的常量指针。当我声明并分配一个不相关的其他const指针给另一个常量c字符串时,原来的fn被修改。我一直试图弄清楚为什么有一段时间,但看不到可能会导致这种情况的原因?为什么分配不相关的字符串会导致另一个字符串被修改?

输出:

原始FN:sampleStrWithExtension

改性FN:randomStr2ModifiedFn

int main() { 
     std::string baseString = "sampleStr"; 
     std::string randomBaseString = "randomStr2"; 
     const char* const fn = (baseString + "WithExtension").c_str(); 
     std::cout << "Original fn: " << fn << std::endl; 
     const char* const variableNotFn = (randomBaseString + "ModifiedFn").c_str(); 
     std::cout << "Modified fn: " << fn << std::endl; 
     return 0; 
    } 
+1

'fn =(baseString +“WithExtension”)。c_str()'不是一个非常重要的任务。由表达式'baseString +'WithExtension“'创建的'string'对象在完成赋值后立即被销毁,而变量'fn'指向未分配的内存,这可以在任何时候重用。 –

+4

'x.c_str()'的生命周期永远不会超过'x'的生命周期。 – Angew

回答

8
const char* const fn = (baseString + "WithExtension").c_str(); 

这导致未定义的行为。

baseString + "WithExtension" 

这会创建一个临时对象std::stringstd::string上的+运算符会返回一个新的std::string,并且在此表达式的上下文中,返回的std::string将成为临时对象。 c_str()返回一个指向这个临时对象的内部缓冲区的指针。

c_str()返回的指针仅在修改std::string之前有效,否则将被销毁。在上述表达式的末尾,临时对象被破坏。

稍后使用此指针会导致未定义的行为。

+2

严格来说,这不是一个未定义的行为。它只是一个指向没有更多现有字符串的指针。未定义的行为发生在您取消引用时 – valdo

相关问题