C++オブジェクトの構造、複製、解析

2002 ワード

testobj.h:
#ifndef __TESTOBJ_H

#define __TESTOBJ_H

#include <iostream>
class TestObj{
private:
	int *p;
public:
	static int count;
	TestObj(){
		p = new int(1);
		count++;
		std::cout << "init p" << std::endl;
	};
	TestObj(const TestObj & obj){
		p = new int(1);
		count++;
		std::cout << "copy p" << std::endl;
	};
	~TestObj(){
		if (p != NULL){
			delete p;
			p = NULL;
			std::cout << "delete p , p="<< p<< std::endl;
		}
		
	};
};

int TestObj::count = 0;
#endif
test.cc
#include <iostream>
#include <vector>
#include <windows.h>
#include "testobj.h"

using namespace std;

int main(){
	vector<TestObj> objvector;
	//objvector.reserve(10);
	TestObj obj1;
	objvector.push_back(obj1);
	Sleep(1000);
	cout << "------------" << endl;
	TestObj obj2;
	objvector.push_back(obj2);
	Sleep(1000);
	cout << "------------" << endl;
	TestObj obj3;
	objvector.push_back(obj3);
	Sleep(1000);
	cout << "------------" << endl;
	cout << "Count:" << TestObj::count << endl;
}
実行結果:
init p copy p ------------ init p copy p delete p , p=00000000 copy p ------------ init p copy p copy p delete p , p=00000000 delete p , p=00000000 copy p ------------ Count:9 delete p , p=00000000 delete p , p=00000000 delete p , p=00000000 delete p , p=00000000 delete p , p=00000000 delete p , p=00000000
本来なら普通のオブジェクトを3回作成し,3回のオブジェクトの複製構造であるべきであるが,結果として3回のオブジェクトの複製構造が多くなった.原因を分析します.
まずstd::vectorの要素格納方式を理解しなければならない.std::vectorは連続的にデータを格納する.要素を追加すると、容器の空間が不足すると、std::vectorは元の要素と新しく追加した要素を格納するために記憶空間を再割り当てなければならない.古い記憶空間に格納された要素は新しい記憶空間にコピーされ、次に新しい要素を挿入する.最後に古いストレージスペースを取り消します.十分なスペースが事前に割り当てられている場合(objvector.reserve(10);)、追加のレプリケーション操作はありません.次の図は、上記の実行結果の動作を示しています.
最後の6つのプロファイルは、作成された3つのTestobjオブジェクトとobjvectorのうちの3つのTestobjオブジェクトのプロファイルです.