簡體   English   中英

如何將std :: shared_ptr用作類成員?

[英]How to use std::shared_ptr as class member?

我需要創建一個這樣的類。 但是,當我運行此代碼時,我得到:

"Error in `./a.out': free(): invalid next size (fast)"

MyClass怎么了? 如何正確使用shared_ptr作為類成員?

#include <memory>

class MyClass
{
public:
    MyClass(unsigned size) {
        _size = size;
        _arr = std::make_shared<int>(size);
        for (int i = 0; i < size; i++)
            _arr.get()[i] = 0;
    }

    MyClass(const MyClass& other) {
        _arr = other._arr;
        _size = other._size;
    }

    MyClass& operator=(const MyClass& other) {
        _arr = other._arr;
        _size = other._size;
    }

    void setArr(std::shared_ptr<int> arr, unsigned size) {
        _size = size;
        _arr = arr;
    }

    ~MyClass() {
        _arr.reset();
    }

private:
    std::shared_ptr<int> _arr;
    unsigned _size;
};

int main() {
    MyClass m(4);
    return 0;
}

謝謝,我誤解了make_shared的功能。 如果我想使用int *(不是std :: vector或std :: array),我應該寫這個嗎? (並且不要修復其他方法)

    MyClass(unsigned size) {
        _size = size;
        _arr = std::shared_ptr<int>(new int[size]);
        for (int i = 0; i < size; i++)
            _arr.get()[i] = 0;
    }

請看看std :: make_shared如何工作。

基本上, std :: make_shared

構造一個T類型的對象,並將其包裝在std :: shared_ptr中

在您的情況下Tint ,因此std :: make_shared創建了一個int類型的對象,並將其包裝在std :: shared_ptr中 結果,內存是為單個int分配的,而不是為int數組分配的,因此程序會導致Undefined Behavior

我想您可以使用std :: default_delete來避免出現問題:

_arr = std::shared_ptr<int>(new int[size], std::default_delete<int[]>());

另請注意:

  1. 您的運算子=不返回任何內容。
  2. 您不應該在變量名下加下划線。
  3. 不必在類析構函數中為_arr調用reset()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM