物件的生存期 記憶體 深度複製 複製建構函式 筆記

Wzline發表於2024-07-14

棧上的東西如何存在?
棧是類似一種資料結構 ,像摞在桌子上的一堆書,要看中間的書需要把上面的書拿走
作用域:
形象成一本書,書內宣告的變數作用域結束,要把這本書從書堆中拿出來

作用域指標

是什麼:
基本是個類 是一個指標的包裝器,在構造時用堆分配指標
析構時刪除指標,可以實現自動化new和delete
寫法;
引用
std::unique_ptr<類名>名字;
程式碼示例:

class Entity
{
public:
	int x, y;//this指向這裡
	Entity(int x, int y)
	{
		this->x = x;
		this->y = y;
	}
};
class ptr
{
private:
	Entity* m_ptr;
public:
	ptr(Entity* ptrs)
		:m_ptr(ptrs)
	{

	}
	~ptr()
	{
		delete m_ptr;
	}
};
int main()
{
	Entity* hh = new Entity(1,2);
	ptr phh(hh);
}

智慧指標

是什麼:
是原始指標的包裝
作用:
當你使用new時不用delete

unique_ptr

甚至不用new實現自動化
程式碼示例:unique_ptr
注意:不能被複制

int main()
{
   std::unique_ptr<Entity>entity (new Entity());//普通構建 
若是建構函式碰巧丟擲異常會造成記憶體洩漏
   std::unique_ptr<Entity>entity (new Entity())=std::make_unique<Entity>();//
//這種寫法會避免上面的問題
{

shared_ptr

工作方式:引用計數
是什麼:
基本上是一種方法
作用:
跟蹤你的指標有多少個引用當引用計數為零時,它會被刪除;
寫法:
std::shared_ptrshared=std::make shared();
記憶體分配:
分配一塊記憶體塊用來儲存引用個數;
先建立一個new Entity 傳給shared_ptr建構函式,要做兩次記憶體分配,先做一次new Entity的分配然後是shared_ptr的控制記憶體塊分配。

weak_ptr 弱指標

用法:
std::weak_ptrweak=sharedEntity://弱指標引用shared_ptr指標不會增加引用數;

memcpy()

寫法:
memcpy(目的地;來源;大小)
程式碼示例:

class String
{
private:
    char*m_Buffer;
    unsigned int m_Size;
public:
    String(const String&other)
       :m_size(other.m-_size)
     memcpy(m_Buffer,other.m_Buffer,m_size)
}
int main()
{
  String string="wzs";
  String second=string;
second[2]='a';
列印結果為
}

深複製

實際上覆制了 整個物件
實現:
透過複製建構函式,複製建構函式是一個建構函式
複製建構函式是什麼:
要複製的變數和正在建立的變數同一型別,
程式碼示例:
int main()
{

}

淺複製

不會去到指標的內容或指標指向的地方,也不會去複製它
預設複製建構函式
程式碼示例:

string (const string&other)
:m_Buffer(other.m_Buffer),m_size(other.m_size)
{}
suing string=std::string
int main()
{
 
}

相關文章