假設我有一個帶有int指針成員變量「i」的struct「s」。我在s的缺省構造函數中爲堆分配內存。後來在代碼的其他部分中,我通過值將某個s的實例傳遞給某個函數。我在這裏做一個淺拷貝嗎?假設我沒有實現任何複製構造函數或賦值運算符或任何s ...只是默認的構造函數。關於C++中淺拷貝的問題
5
A
回答
8
爲了跟進@ [don.neufeld.myopenid.com]的說法,它不僅是一個淺拷貝,而且可以是(選擇)內存泄漏或懸掛指針。
// memory leak (note that the pointer is never deleted)
class A
{
B *_b;
public:
A()
: _b(new B)
{
}
};
// dangling ptr (who deletes the instance?)
class A
{
B *_b;
public:
A()
... (same as above)
~A()
{
delete _b;
}
};
要解決這個問題,有幾種方法。
始終在使用原始內存指針的類中實現複製構造函數和operator =。
class A
{
B *_b;
public:
A()
... (same as above)
~A()
...
A(const A &rhs)
: _b(new B(rhs._b))
{
}
A &operator=(const A &rhs)
{
B *b=new B(rhs._b);
delete _b;
_b=b;
return *this;
};
不用說,這是一個重大的痛苦,有相當多的細微之處得到正確的。我甚至不確定我在這裏做了什麼,而且我已經做了幾次。不要忘記你必須複製所有的成員 - 如果你稍後添加一些新成員,不要忘記添加它們!
在您的課堂上製作複製構造函數和operator = private。這是「鎖門」解決方案。它簡單而有效,但有時過度保護。
class A : public boost::noncopyable
{
...
};
切勿使用原始指針。這很簡單有效。這裏有很多的選擇:
- 使用字符串類,而不是原始字符指針
- 使用std :: auto_ptr的,提高:: shared_ptr的,提高:: scoped_ptr的等
例子:
// uses shared_ptr - note that you don't need a copy constructor or op= -
// shared_ptr uses reference counting so the _b instance is shared and only
// deleted when the last reference is gone - admire the simplicity!
// it is almost exactly the same as the "memory leak" version, but there is no leak
class A
{
boost::shared_ptr<B> _b;
public:
A()
: _b(new B)
{
}
};
5
是的,這是一個淺的副本。你現在有兩個s(調用者中的一個,堆棧中的一個作爲參數),每個都包含一個指向同一塊內存的指針。
2
您將有s
結構的兩個副本,每一個都會有自己的i
指針,但兩者i
指針將指向內存中的同一地址相同的值 - 所以,是的,這將是一個淺拷貝。
相關問題
- 1. 的JavaScript - 淺拷貝問題
- 2. 淺拷貝和深拷貝在C
- 3. 淺拷貝或深拷貝?
- 4. 簡單的問題 - 淺拷貝(VB.Net)
- 5. 淺拷貝
- 6. Javascript淺拷貝
- 7. Java中的淺拷貝
- 8. 硬拷貝vs淺拷貝javascript
- 9. 淺拷貝和深拷貝示例
- 10. 關於深拷貝示例的問題
- 11. 混淆hashtable的淺拷貝
- 12. 散列集的淺拷貝
- 13. std :: map的淺/深拷貝
- 14. 矢量STD C++ - 深或淺拷貝
- 15. 通過使淺拷貝
- 16. structDelete不影響淺拷貝?
- 17. 未能淺拷貝對象
- 18. 方法Array.Clone是淺拷貝?
- 19. 淺拷貝與向量
- 20. 從繼承類淺拷貝
- 21. 淺拷貝與基元
- 22. 在Java中的集合的淺拷貝
- 23. 爲什麼懶的拷貝時我們有深拷貝和淺拷貝?
- 24. 懶惰的拷貝 - 如何從淺拷貝創建深層拷貝
- 25. Java ArrayList的拷貝構造函數是淺拷貝還是深拷貝?
- 26. Java的克隆 - 深拷貝和淺拷貝
- 27. 使用追加方法的Python淺拷貝和深拷貝
- 28. 關於gsoap拷貝的sigsegv
- 29. 在此程序中淺拷貝
- 30. JS:是否Object.assign()創建深拷貝和淺拷貝
您的賦值運算符不是異常安全的。查看關於複製和異常安全的最新問題:http://stackoverflow.com/questions/214891/checklist-for-writing-copy-constuctor-and-assignment-operator-in-c#214966 – 2008-10-19 08:29:30