Array作为C ++类成员变量

时间:2011-12-31 20:23:59

标签: c++ arrays memory-management

我可以用以下方式在c ++中使用数组作为类的成员变量吗?或者我应该将它声明为指针?以下代码工作正常。这样做是否正确? (我为了简单而公开了)。我也不确定我是否正确使用地图。

#include <iostream>
#include <map>
#include <string.h>

using namespace std;

class SimpleMap{
public:
    map<string,int> m;
    int i;
    int j[];
    SimpleMap(int ii);
};

SimpleMap::SimpleMap(int ii){
    i = ii;
}



int main(){
    SimpleMap mm(5);
    mm.m["one"] = 1;

    cout<<"hi hru";

    cout<<mm.m["one"];

    mm.j[0] = 11;
    cout << mm.j[0];
}

编辑:我添加了地图成员变量。

4 个答案:

答案 0 :(得分:5)

实际上,你已经有了一个指针。但它没有初始化。

设置j[0]在某些情况下会起作用,当然,但是您要写入未分配的内存,或者更糟糕的是,写入另一个对象使用的内存。基本上你在你的应用程序中创建了一个巨大的漏洞。

考虑使用std::vector,它只是为您完成所有分配/解除分配。如果这不是一个选项,至少初始化数组并且不要超过你的分配。

j[]只是*j,它只是指向随机存储器地址的指针。非常非常非常糟糕。

答案 1 :(得分:3)

int j[];

不是你的想法。这实际上定义了一个指针:int* j;,它未被初始化,并且您正在从中读取未初始化状态,这是未定义的行为,又名错误

只需使用std::vector

答案 2 :(得分:0)

不,我认为在你的声明初始化数组时会使用int j[];。你应该提供数组的上限。我认为这是正确的int j[]={3,2,1};

答案 3 :(得分:0)

正如我在Google上发现的那样,我想在答案中消除混乱:使用T name[]作为结构的最后一个成员称为“弹性数组成员”,并定义为对C的扩展,由例如GCC和Clang。使用示例:

struct Array{
  int len;
  float ar[];
};
// Create
Array* foo = malloc(sizeof(Array) + 100 * sizeof(float));
foo.len = 100;
// Use
for(int i=0; i<foo.len; i++) foo.ar[i] = i * M_PI;

特殊成员实际上不是成员,而是一些编译器魔术师,类似于struct Array{ int len; float ar[100]; };,但您可以在运行时选择大小。

但是,在C ++中,这很难使用,因为您需要考虑对象寿命。因此,请勿在C ++中按原样使用

对于OP:您可能想要一个真正的指针,并需要为所指向的数组分配内存。显然,std::vector可以解决已经指出的大多数问题。