分配类型为自己的向量的内存 Class C++

Posted

技术标签:

【中文标题】分配类型为自己的向量的内存 Class C++【英文标题】:Allocating memory of vector whose type is own Class C++ 【发布时间】:2013-05-07 10:52:03 【问题描述】:

到目前为止,我很少有关于为向量分配内存的帖子

(Allocating memory for class in C++ Allocating memory for class in C++,例如) 但我没有找到解决我现在面临的问题的方法。

我们走吧.. 根据 S.Prata 的说法,

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?

输出是某种灌木

如何为这种类型的向量正确分配内存,这些向量包含指向自己定义的类的智能指针作为类型?

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

【问题讨论】:

如何声明您的Portfel 对象?你在Inwestor构造函数中做了什么? 在 Inwestor::Inwestor 我做 Portfel p1; 您粘贴的错误发生在Inwestor::nowy_profil() 调用operator&lt;&lt; 时。请出示该方法。 “类型为自身类的向量”在哪里? 【参考方案1】:

要将指向新Akcja 的指针添加到向量中,您会说

akcje.push_back(new Akcja);

您通常根本不需要管理 vector 内存 - 这就是类的用途。

特别是,reserve 用于在您事先知道需要多少时确保所有元素都有空间,这样您就可以节省重新分配并将向量复制到新位置所需的时间它会增长,或者避免内存碎片(这很少需要担心)。 它不用于添加元素。

【讨论】:

以上是关于分配类型为自己的向量的内存 Class C++的主要内容,如果未能解决你的问题,请参考以下文章

c++类型内存分配规则

c++ 内存分配向量的指针

C++ 的向量如何分配内存

C++ 数据类型提高+内存四区

为字符串向量预分配内存(C++ vector<string>)

跟踪 C++ 内存分配