我正在嘗試為 C 中的張量應用程式構建操作樹。當我寫作時,c = a b我希望c有兩個指標a和b. 我將“this”傳遞a給建構式,c然后釋放解構式中的記憶體。
template<typename T>
struct ObjectPointers {
const ObjectPointers<T> *left;
const ObjectPointers<T> *right;
vector<T> data;
// initialize left and right in constructor
ObjectPointers(std::initializer_list<T> list) : data(list) {
left = nullptr;
right = nullptr;
}
~ObjectPointers(){
// somewhere around here the error happens
if(left != nullptr)
delete left;
if(right != nullptr)
delete right;
}
ObjectPointers(const ObjectPointers<T> *left, const ObjectPointers<T> *right) : left(left), right(right) {}
//overload
ObjectPointers operator (const ObjectPointers &other) const {
// I create a new object with the left and right of the current object
return ObjectPointers<T>(this, &other);
}
};
int main() {
ObjectPointers<int> a = {1, 2, 3};
ObjectPointers<int> b = {4, 5, 6};
ObjectPointers<int> c = a b;
return 0;
}
我理解我撰寫的代碼的方式如下:c創建物件并指向a和b。
c超出范圍 => 它呼叫了解構式 => delete a=> 的解構式a被呼叫 => 沒有任何反應
=> delete b=> 的析構b函式被呼叫 => 什么都沒有發生 => 的析構c函式完成
在我寫“什么都沒有發生”的地方,實際上發生了分段錯誤,我不明白為什么。
我也嘗試過使用smart_pointers,但這并沒有真正幫助。我用過std::unique_ptr<>。
uj5u.com熱心網友回復:
有什么問題?
這不是一個合理的設計,因為它不尊重 的通常屬性,例如(x y) z與 相同x (y z)。
如果你仍然想讓它作業,你需要提取operator 類的,并使用二進制的多載operator 。
此外,您必須正確使用銷毀,并避免銷毀仍在某些ObjectPointers. 為此,您應該使用shared_ptr而不是unique_ptr.
(優點是當一個物件被銷毀時,只要另一個物件仍然使用該指標,共享指標就會保持活動狀態。您當前使用原始指標的設計可能會導致多個ObjectPointers使用相同的指標,而第一個ObjectPointers被洗掉的指標將洗掉指標,而其他指標則參考懸空指標。這是未定義的行為,非常糟糕)
如何解決?
代碼看起來有點像這樣(注意,我沒有分析它是否進一步解決其他問題):
template<typename T>
struct ObjectPointers {
const std::shared_ptr<ObjectPointers<T>> left;
const std::shared_ptr<ObjectPointers<T>> right;
std::vector<T> data;
// initialize left and right in constructor
ObjectPointers(std::initializer_list<T> list) : data(list) {
}
ObjectPointers(const ObjectPointers &c) = default;
~ObjectPointers(){ // no need, shared ptr take care
}
ObjectPointers(std::shared_ptr<ObjectPointers<T>> left, std::shared_ptr<ObjectPointers<T>> right) : left(left), right(right) {}
};
和:
//overload
template <class T>
ObjectPointers<T> operator (ObjectPointers<T> a, ObjectPointers<T> b) {
// I create a new object with the left and right of the current object
return ObjectPointers<T>(std::make_shared<ObjectPointers<T>>(a), std::make_shared<ObjectPointers<T>>(b));
}
這是一個在線演示,包括列印結果結構。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/532298.html
標籤:C 指针运算符重载
