printf问题与const char*变量

mic*_*ael 6 c++ printf const-char

我陷入了printf问题.如果我能在这里得到一些帮助,我将不胜感激:在下面的代码中,我可以看到字体系列在第一个printf()中被正确替换,但是如果我将它设置为变量,我只得到一个空字符串.如何将其放入变量并具有正确的值?我只是不想输入'font.family().family().string().utf8().data()'到处都是?

我用同样的方法做了这个:

void myMethod() {
      const char* fontFamily = font.family().family().string().utf8().data();
      // get displayed correctly
      printf ("drawText1 %s \n", font.family().family().string().utf8().data());
      // get an empty string
      printf ("drawText2 %s \n", fontFamily);
}
Run Code Online (Sandbox Code Playgroud)

而'data()'的签名是

class CString {
public:
    CString() { }
    CString(const char*);
    CString(const char*, unsigned length);
    CString(CStringBuffer* buffer) : m_buffer(buffer) { }
    static CString newUninitialized(size_t length, char*& characterBuffer);

    const char* data() const;
 //...

}
Run Code Online (Sandbox Code Playgroud)

utf8()的签名是

class String {
 CString utf8() const;
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Mar*_*som 4

链中的某些东西font.family().family().string().utf8().data()正在返回一个临时对象。在您的第一个中printf,临时对象在返回之前不会超出范围printf。在第二个中printf,在进行指针分配后临时已被销毁,并且指针现在无效。您正在看到“未定义行为”的典型示例。

有两种方法可以解决这个问题。要么在临时数据被销毁之前复制数据,要么引用临时数据。只要类有复制运算符,复制可能是最简单、最清晰的。假设utf8()生成一个临时的CString,这将是

CString fontFamily = font.family().family().string().utf8();
printf ("drawText2 %s \n", fontFamily.data());
Run Code Online (Sandbox Code Playgroud)

  • @尼尔巴特沃斯:你在说什么?任何中间调用都完全有可能返回临时值。这个临时文件将在“fontFamily”初始化后立即被杀死(这使得“fontFamily”悬而未决)。该语言不保证会延长临时的生命周期。你从哪里得到这个想法的?C++ 中唯一听起来相似的东西是专门保证引用的,但在这个例子中我们没有引用。 (2认同)