-->

数组的内存分配不工作(Array memory Allocation doesn't wor

2019-10-18 03:41发布

我的下一个类:

class A {
};

class B : public A {
  int num;
};

在我的主,我有:

int main() {
    A* vec; // A is a class with pure virtual functions
    vec = new B[2]; // want to create a vector of B
}

VEC [0]被正确地定义,但是VEC [1]是NULL。 为什么没有把它分配我一个合适的内存?

我不想改变主要的线条。 只是使它工作。

(我知道我可以改变主要为:B * VEC =新的B [2],但我不希望)

任何帮助表示赞赏!

Answer 1:

你不能把阵列多态,C ++语言不支持它。 表达vec[x]使用指针算法以确定该元件的位置。 如果你通过一个基类指针访问它,如果物体的大小以任何方式改变它不会工作。

例如,你有基类大小为4个字节和亚类是在大小为8个字节。

base *a = new child[4];

当访问a[1]的计算编译器使用基类的大小的偏移量。 在这种情况下,偏移量是最终指向第一元件的中部4个字节。

我建议使用std::vectorstd::array与适当的智能指针的指针。

// For arrays that needs to be resized (requires delete for each new)
std::vector<A*> vec(5, NULL);
for(int i = 0; i < vec.size(); i++)
{
    vec[i] = new B();
}

// for arrays that are fixed in size (requires delete for each new)
std::array<A*, 5> vec;
for(int i = 0; i < vec.size(); i++)
{
    vec[i] = new B();
}

// for arrays that are fixed in size with smart pointers
// no delete needed 
std::array<std::unique_ptr<A>, 5> vec;
for(int i = 0; i < vec.size(); i++)
{
    vec[i].reset(new B());
}


Answer 2:

如果你希望它是多态的只是创建一个指针数组

new A*[array_size]



Answer 3:

此代码段说明您所遇到的问题。

#include <iostream>
using namespace std;
class A {
};

class B : public A {
  int num;
};

int main() {
    A* vec; // A is a class with pure virtual functions
    vec = new B[2]; // want to create a vector of B

    cout << sizeof(vec) << endl;
    cout << sizeof(*vec) << endl;
    cout << sizeof(vec[2]) << endl;
    cout << sizeof(new B()) << endl;
}

在指针arrithmetic,被用来分配你的指针类型的大小什么增加,而不是真正的类型,它指向的对象的大小。 更简单地说,语言不支持多态数组。 这是一个简单的原因作出解释。



文章来源: Array memory Allocation doesn't work