为什么我的输出已损坏?

时间:2017-01-14 15:45:48

标签: c++ stringstream

我正在使用以下函数返回当前安装的内存量:

const char* Aries::Memory::GetInstalledMemory() {
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof(statex);
    GlobalMemoryStatusEx(&statex);
    std::stringstream ss;
    ss << statex.ullTotalPhys / (1024 * 1024 * 1024);
    return ss.str().c_str();
}

我将其与另一个stringstream结合使用并将其输出到屏幕:

CryLogAlways("$1[Aries | System]$2 Probe system.");
Aries::Memory *pMem = new Aries::Memory();
stringstream ss;
ss << "$1[Aries | System]$2 Result of probe: installed memory is ";
ss << pMem->GetInstalledMemory();
ss << "GB.";

预期输出为:

  

$ 1 [白羊座|系统] $ 2探测结果:已安装的内存为32.00GB。

我得到的输出是:

  

Ö

同时如果我调整函数使其返回DOUBLE,它可以正常工作:

DOUBLE Aries::Memory::GetInstalledMemory() {
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof(statex);
    GlobalMemoryStatusEx(&statex);
    return statex.ullTotalPhys / (1024 * 1024 * 1024);
}

似乎在ostringstream函数内使用GetInstalledMemory()进行强制转换会导致此错误。但是我需要返回const char *

GetInstalledMemory的输出似乎正在破坏使用它的整个stringstream;哪里出错了,我该怎么办呢?

1 个答案:

答案 0 :(得分:3)

ss.str()返回一个std::string对象,但在您的代码中,它只会在一行代码中作为临时对象存在。然后你调用c_str(),它给出了一个指向临时字符串所拥有的内存的指针。但是一旦你的函数返回,因为临时被破坏,内存变得无法访问。

一个好的解决方案是更改GetInstalledMemory以返回std::string对象而不是字符指针。然后它只能return ss.str();,字符串对象将处理所有事情。