2013-05-07 2 views
1

Я до сих пор несколько сообщений о выделении памяти для векторовВыделяя память вектора типа которого является собственный класс C++

(Allocating memory for class in C++ Allocating memory for class in C++, например) , но мне не удалось найти решение для проблема, с которой я сейчас сталкиваюсь.

Пойдемте .. По S.Prata,

tab.push_back(); 

выделяет память для нового объекта мы помещаем в вектор называется «вкладка» Если это так, мы не должны указать длину вектора внутри декларации, правильно?

vecotr<Type> tab; 

Итак, зная эти факты, я хочу поделиться с вами.

instrumenty.h

#pragma once 
#include "portfel.h" 
#include <string> 
#include <memory> 

class Spolka; 

class Akcja 
{ 
    std::shared_ptr<Spolka> firma; 
    double cena_zakupu; 
    double cena_aktualna; 
public: 
    Akcja(); 
    ~Akcja(); 
}; 

class Obligacja 
{ 
    int a; 
public: 
    Obligacja(); 
    ~Obligacja(); 
}; 

class Kontrakt 
{ 
    int a; 
public: 
    Kontrakt(); 
    ~Kontrakt(); 
}; 

Сейчас идет "portfel.h"

#pragma once 
#include <fstream> 
#include <vector> 
#include <memory> 
#include "instrumenty.h" 

class Akcja; 
class Obligacja; 
class Kontrakt; 

class Portfel 
{ 
    friend class Inwestor; 
    int a; 
    std::vector< std::unique_ptr<Akcja> > akcje; 
    std::vector< std::unique_ptr<Obligacja> > obligacje; 
    std::vector< std::unique_ptr<Kontrakt> > kontrakty; 
public: 
    Portfel(); 
    ~Portfel(); 
    friend std::ofstream& operator<<(std::ofstream& zapisz, Portfel& p1); 
}; 

portfel.cpp (причину проблемы)

Portfel::Portfel() 
{ 
    a=0; 
    akcje.push_back(NULL);  // <------- THIS THING 
    //akcje.reserve(class Akcja); // <-- How to properly define this according to 
             portfel.h? 
} 

Выход какой-то втулки

enter image description here

Как правильно распределить память для таких типов векторов, которые состоят из интеллектуальных указателей, чтобы иметь собственный класс в качестве типа?

==3238== Invalid read of size 2 
==3238== at 0x409336: operator<<(std::basic_ofstream<char, std::char_traits<char> >&, Inwestor*) (zapis.cpp:13) 
==3238== by 0x4066B5: Inwestor::nowy_profil() (inwestor.cpp:116) 
==3238== by 0x404B00: menu1() (funkcje.cpp:97) 
==3238== by 0x40208E: main (main.cpp:27) 
==3238== Address 0x5a07140 is 8 bytes after a block of size 8 alloc'd 
==3238== at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==3238== by 0x408B13: __gnu_cxx::new_allocator<std::unique_ptr<Akcja, std::default_delete<Akcja> > >::allocate(unsigned long, void const*) (new_allocator.h:94) 
==3238== by 0x40892A: std::_Vector_base<std::unique_ptr<Akcja, std::default_delete<Akcja> >, std::allocator<std::unique_ptr<Akcja, std::default_delete<Akcja> > > >::_M_allocate(unsigned long) (in /home/rideofyourlife/Pulpit/DM/all) 
==3238== by 0x4084C3: void std::vector<std::unique_ptr<Akcja, std::default_delete<Akcja> >, std::allocator<std::unique_ptr<Akcja, std::default_delete<Akcja> > > >::_M_emplace_back_aux<std::unique_ptr<Akcja, std::default_delete<Akcja> > >(std::unique_ptr<Akcja, std::default_delete<Akcja> >&&) (vector.tcc:405) 
==3238== by 0x408234: void std::vector<std::unique_ptr<Akcja, std::default_delete<Akcja> >, std::allocator<std::unique_ptr<Akcja, std::default_delete<Akcja> > > >::emplace_back<std::unique_ptr<Akcja, std::default_delete<Akcja> > >(std::unique_ptr<Akcja, std::default_delete<Akcja> >&&) (vector.tcc:102) 
==3238== by 0x407E5D: std::vector<std::unique_ptr<Akcja, std::default_delete<Akcja> >, std::allocator<std::unique_ptr<Akcja, std::default_delete<Akcja> > > >::push_back(std::unique_ptr<Akcja, std::default_delete<Akcja> >&&) (stl_vector.h:900) 
==3238== by 0x407AE2: Portfel::Portfel() (portfel.cpp:6) 
==3238== by 0x405D07: Inwestor::Inwestor() (inwestor.cpp:13) 
==3238== by 0x402126: __static_initialization_and_destruction_0(int, int) (main.cpp:14) 
==3238== by 0x402161: _GLOBAL__sub_I_q (main.cpp:31) 
==3238== by 0x40985C: __libc_csu_init (in /home/rideofyourlife/Pulpit/DM/all) 
==3238== by 0x536D6FF: (below main) (libc-start.c:185) 
+0

Как вы объявляете свой объект 'Portfel'? Что вы делаете в конструкторе 'Inwestor'? –

+0

In Inwestor :: Inwestor I Portfel p1; – user1960582

+0

Ошибка, которую вы вставили, происходит, когда 'Inwestor :: nowy_profil()' вызывает 'operator <<'. Пожалуйста, покажите этот метод. – Useless

ответ

0

Чтобы добавить указатель на новую Akcja вектору, вы бы сказали

akcje.push_back(new Akcja); 

Вы обычно не нужно управлять vector памяти у всех - это то, что класс для.

В частности, reserve используется, чтобы убедиться, что есть место для всех элементов, когда вы заранее знаете, сколько вам нужно, чтобы вы могли сэкономить время, необходимое для перераспределения и копирования вектора на новое место, поскольку оно растет или во избежание фрагментации памяти (о чем очень редко приходится беспокоиться).
Он не используется для добавления элементов.