带C的动态内存

时间:2013-07-10 08:20:09

标签: c malloc

struct forcePin {
    char _name[512];
};

struct forcePin *_forcePin[500000];    
_forcePin[i] = (struct forcePin *) malloc (sizeof (struct forcePin));

我可以知道下面显示的是什么行吗?

_forcePin[i] = (struct forcePin *) malloc (sizeof (struct forcePin));

我不熟悉c,如果你能告诉我如何使这一行成为C ++格式。谢谢

5 个答案:

答案 0 :(得分:7)

动态内存分配在C中非常重要,你应该真正学会它。

有问题的行是从堆中分配内存,即sizeof(struct forcePin)个字节。 malloc函数返回指向此分配内存的通用指针,该指针分配给指针_forcePin[i]

关于该行的一件事,你应该类型转换malloc函数的返回值。


在C ++中,您使用new语句来分配指针:

_forcePin[i] = new forcePin;

但是,在C ++中使用指针和动态堆分配是不受欢迎的。我建议你使用std::vector非指针结构:

struct forcePin {
    std::string name;
};

std::vector<forcePin> forcePin;
forcePin.push_back(forcePin{});

答案 1 :(得分:4)

调用standard library function malloc()来分配sizeof (struct forcePin)字节的动态(“堆”)内存。

然后pointlessly casting the returned pointer,并将其存储在变量_forcePin[i]

这不是编写此代码的最佳方式,在我看来应该是:

_forcePin[i] = malloc(sizeof *_forcePin[i]);

请注意,如果分配是从循环中断开的(如i所暗示的那样),那么该代码看起来像是在分配512 * 500,000个字节,或者大约244 MB的内存。由于它完成了50万次分配调用,因此也会产生相当大的开销。

如果真的需要所有内存,最好尝试单个malloc()调用,然后将分配的缓冲区拆分为500,000个部分。这样做很可能会更快,因为malloc()可能很昂贵而且有50万次调用很多,但它肯定会节省内存,因为会有一个开销成本而不是500,000。

答案 2 :(得分:1)

_forcePin[i] = (struct forcePin *) malloc (sizeof (struct forcePin));

分配大小为forcePin的内存块,并将分配的内存从(void *)转换为forcePin类型。在C ++中你会这样做:

_forcePin[i] = new forcePin();

或者更好,你可以:

std::vector<forcePin> vec;
vec.push_back(forcePin());

答案 3 :(得分:1)

这一行是你的通用C风格内存分配:

  1. 为结构mallocforcePin)所需的确切字节数分配内存(sizeof(struct forcePin))。
  2. 因为malloc的返回值是指向新分配的内存的void指针(void *),将其强制转换为指向forcePin结构((struct forcePin *))的指针< / LI>

    C ++版本类似于:

    _forcePin[i] = new forcePin;
    
    • 在C ++中,引用struct type时不需要struct关键字)
    • delete _forcePin[i]
    • 不要忘记释放内存

    因为看起来您可能想要创建所有500000 forcePin,所以您可以一步完成:

    forcePin _forcePins = new forcePin[500000];
    

答案 4 :(得分:0)

您询问的行分配一块内存(请参阅malloc()),并将其地址存储在_forcePin数组中,索引为i

在C ++中,您可以使用new,即:_forcePin[i] = new forcePin