SORU
19 Temmuz 2010, PAZARTESİ


Neden bir vektör içine bir unique_ptr push_back miyim?

Bu program ile yanlış nedir?

#include <memory>
#include <vector>

int main()
{
    std::vector<std::unique_ptr<int>> vec;

    int x(1);
    std::unique_ptr<int> ptr2x(&x);
    vec.push_back(ptr2x); //This tiny command has a vicious error.

    return 0;
}

Hata:

$ g   -std=gnu  0x main.cpp
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c 
 /mingw32/bits/c  allocator.h:34:0,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c 
 /bits/allocator.h:48,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c 
 /memory:64,
                 from main.cpp:6:
c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c  /bits/unique_ptr.h: I
n member function 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*,
 const _Tp&) [with _Tp = std::unique_ptr<int>, _Tp* = std::unique_ptr<
int>*]':
c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c  /bits/stl_vector.h:74
5:6:   instantiated from 'void std::vector<_Tp, _Alloc>::push_back(con
st value_type&) [with _Tp = std::unique_ptr<int>, _Alloc = std::alloca
tor<std::unique_ptr<int> >, value_type = std::unique_ptr<int>]'
main.cpp:16:21:   instantiated from here
c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c  /bits/unique_ptr.h:20
7:7: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::uniqu
e_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_D
eleter = std::default_delete<int>, std::unique_ptr<_Tp, _Tp_Deleter> =
 std::unique_ptr<int>]'
c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c  /ext/new_allocator.h:
105:9: error: used here
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c 
 /vector:69:0,
                 from main.cpp:7:
c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c  /bits/unique_ptr.h: I
n member function 'void std::vector<_Tp, _Alloc>::_M_insert_aux(std::v
ector<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {const std::u
nique_ptr<int>&}, _Tp = std::unique_ptr<int>, _Alloc = std::allocator<
std::unique_ptr<int> >, std::vector<_Tp, _Alloc>::iterator = __gnu_cxx
::__normal_iterator<std::unique_ptr<int>*, std::vector<std::unique_ptr
<int> > >, typename std::vector<_Tp, _Alloc>::_Base::_Tp_alloc_type::p
ointer = std::unique_ptr<int>*]':
c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c  /bits/stl_vector.h:74
9:4:   instantiated from 'void std::vector<_Tp, _Alloc>::push_back(con
st value_type&) [with _Tp = std::unique_ptr<int>, _Alloc = std::alloca
tor<std::unique_ptr<int> >, value_type = std::unique_ptr<int>]'
main.cpp:16:21:   instantiated from here
c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c  /bits/unique_ptr.h:20
7:7: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::uniqu
e_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_D
eleter = std::default_delete<int>, std::unique_ptr<_Tp, _Tp_Deleter> =
 std::unique_ptr<int>]'
c:\mingw\bin\../lib/gcc/mingw32/4.5.0/include/c  /bits/vector.tcc:314:
4: error: used here

CEVAP
19 Temmuz 2010, PAZARTESİ


unique_ptr taşımak gerekir:

vec.push_back(std::move(ptr2x));

unique_ptr unique_ptr tek bir kapsayıcı düzenlenen işaretçi sahipliğini güvence altına alır. Bu sadece taşımak unique_ptr iki unique_ptrs sahipliği olurdu çünkü) kopyalarını oluşturmak mümkün değildir.

Bu unique_ptr yanlış kullanımı olduğunu unutmayın. Bu yerel bir değişken için bir işaretçi yönetmek için kullanın. Yerel bir değişken ömrü otomatik olarak yönetilir: yerel değişkenler biter (işlevi, bu durumda döndüğünde örneğin, blok. zaman yok edilir Dinamik olarak nesne ayırmak gerekir:

std::unique_ptr<int> ptr(new int(1));

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • TimMinchinLive

    TimMinchinLi

    23 ŞUBAT 2009
  • tsweeney79

    tsweeney79

    21 Ocak 2008
  • Viktorija A.

    Viktorija A.

    28 Mart 2009