C++ 临时对象的生存周期测试:没有引用的前提下,存续周期为当前行行代码。下一行代码执行前临时对象被销毁。
此问题源于项目中的使用到Jsoncpp的函数asString()返回的临时临时对象, strcpy有概率出现copy的数据为空。后面发现是 JsonString.asString()被销毁造成的。
Json::Value JsonValue;//JsonValue是存储string类型的
char *src = (char*)JsonString.asString().c_str();
strcpy(dest, src);
写了一个测试代码,来测试这种情况的临时对象的生存周期。的确是当前行代码。
// XXX.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include <string>
class CTest
{
public:
CTest()
{
memset(ach, 0, sizeof(ach));
printf("create\n");
strcpy(ach, "abc");
}
CTest(const CTest & c)
{
strcpy(ach, c.ach);
printf("Copy Constructor called \n") ;
}
virtual ~CTest(){printf("destroy\n");}
std::string GetJString()
{
std::string X = ach;
return X;
}
public:
char ach[10];
};
CTest xc()
{
CTest CTest;
return CTest;
};
std::string xy(char* m)
{
std::string n = m;
return n;
};
void f()
{
std::string a = xy((char*)xc().GetJString().c_str());
char achX[10] = {0};
memcpy(achX, a.c_str(), sizeof(achX)- 1);
}
int _tmain(int argc, _TCHAR* argv[])
{
f();
return 0;
}
VS2010下执行情况: