1

ベクトルへのメモリの割り当てに関する投稿はこれまでほとんどありませんでした

(たとえば、 C++ でのクラスのメモリの割り当てC++ でのクラスのメモリの割り当て ) しかし、現在直面している問題の解決策を見つけることができませんでした。

行こう.. S.プラタによると、

tab.push_back(); 

「tab」というベクトルに入れる新しいオブジェクトにメモリを割り当てます。そうであれば、宣言内でベクトルの長さを述べる必要はありませんよね?

vecotr<Type> tab;

だから、、これらの事実を知って、私はあなたと共有したいと思います.

楽器.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?
}

出力はある種のブッシュです

ここに画像の説明を入力

Type として定義されたクラスを所有するスマート ポインターで構成されるようなベクターの型にメモリを適切に割り当てるにはどうすればよいですか?

==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)
4

1 に答える 1

0

新しいAkcjaベクトルへのポインターを追加するには、次のように言います

akcje.push_back(new Akcja);

通常、メモリを管理する必要はまったくありませんvector。それがクラスの目的です。

特に、reserve必要な量が事前にわかっている場合に、すべての要素に余裕があることを確認するために使用されます。これにより、ベクターが大きくなるにつれて、ベクターを再割り当てして新しい場所にコピーするのに必要な時間を節約できます。メモリの断片化 (心配する必要があるのは非常にまれです)。
要素の追加には使用されません。

于 2013-05-07T12:48:00.747 に答える