C++ 函数内局部变量的生命周期

函数内局部变量的生命周期,是在赋值给返回值后结束的。

#include "stdio.h"
#include 
using namespace std;

static int _count = 0;

class MyString{
	char *_str;
	int _id;
public: 
	MyString(char *p){
		_id = _count++;
		_str = (char *)malloc(3);
		_str[0] = 't';
		_str[1] = 't';
		_str[2] = 0;
		printf("--------ctor MyString %d\n",_id);
	}

	MyString(const MyString& b){
		_id = _count++;
		_str = (char *)malloc(3);
		_str[0] = 't';
		_str[1] = 't';
		_str[2] = 0;
		printf("--------clone ctor MyString %d\n",_id);
	}

	char* c_str(){
		return _str;
	}
	~MyString(){
		printf("destruct MyString %d\n",_id);
		free(_str);
	}
};

MyString test(){
	char *p;
	MyString str(p);
	return str.c_str();
}

int main()
{
	MyString str = test();
	return 0;
}

打印结果为:

--------ctor MyString 0
--------ctor MyString 1
destruct MyString 0
destruct MyString 1

如图所示,先赋值给返回值,再析构。返回值和实际接收的类型相同时,不会再构造一个新的MyString。若返回的是char *,则会。

char * test(){
	char *p;
	MyString str(p);
	return str.c_str();
}

//打印:
--------ctor MyString 0
destruct MyString 0
--------ctor MyString 1
destruct MyString 1

如上图,实际上是先拷贝到char *返回值,再析构MyString 0,然后再构造MyString 1.

你可能感兴趣的:(C++ 函数内局部变量的生命周期)