我正在使用以下函数返回当前安装的内存量:
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
;哪里出错了,我该怎么办呢?
答案 0 :(得分:3)
ss.str()
返回一个std::string
对象,但在您的代码中,它只会在一行代码中作为临时对象存在。然后你调用c_str()
,它给出了一个指向临时字符串所拥有的内存的指针。但是一旦你的函数返回,因为临时被破坏,内存变得无法访问。
一个好的解决方案是更改GetInstalledMemory
以返回std::string
对象而不是字符指针。然后它只能return ss.str();
,字符串对象将处理所有事情。