C ++编程,使用malloc和calloc无法正常运行动态内存

时间:2019-05-17 22:06:04

标签: c++ malloc dynamic-memory-allocation calloc

我刚刚开始学习C ++,但遇到了一个在Internet上找不到的问题,希望您能为我提供帮助。

这是我的代码:

let users = [{ firstName: "sally", lastName: "yates", id: 1 }, { firstName: "bob", lastName: "ross", id: 2 } ]
let pets = [ {pet:"dog", ownerId:1}, {pet:"cat", ownerId:2} ]

let usersMap = {}; users.forEach(u => usersMap[u.id] = u)
let result = pets.map(({pet, ownerId}) => ({ pet, userId: ownerId, username: `${usersMap[ownerId].firstName} ${usersMap[ownerId].lastName}` }))

console.log(result)

编译器返回给我的是:8,8。 如果我使用:

int* a;
int* b;

a = (int*)calloc(1, sizeof(int));
b = (int*)calloc(5, sizeof(int));

cout << sizeof(a) << endl;
cout << sizeof(b) << endl;

编译器返回4、4。

malloc也是一样。我正在使用。

我在做什么错?如果int为4字节长,为什么b 20的大小不大5倍呢?

谢谢!

3 个答案:

答案 0 :(得分:3)

sizeof(*a)sizeof(*b)总是等于4。似乎您希望它们返回数组的大小,但是您需要了解a和{{1 }}是不是数组。它们是指向b的指针。如果int为4,那么sizeof(int)也将为4,并且在编译时就已经知道。

话虽如此,您无需在C ++中使用C库函数sizeof(*a)malloc()。如果需要手动分配内存,请使用calloc()new

delete

如果您需要像a = new int; b = new int[5]; 一样进行零初始化,只需使用calloc来默认构造分配的整数:

()

根据先前调用a = new int(); b = new int[5](); 的方式,使用free()delete代替delete[]

new

但是,这里不需要手动分配内存。只需使用delete a; // Note: no '[]' delete[] b; // Needs '[]'

std::vector<int>

根据经验,您的C ++代码不应调用#include <vector> // ... std::vector<int> a(5); // 5 int elements, zero-initialized. std::cout << a.size() << '\n'; // Will print '5'. newdeletemalloc()calloc()。进行手动内存管理需要更多代码,并且容易出错。请使用free()之类的容器以及vectorshared_ptr之类的智能指针来减少内存和其他资源泄漏的机会。这些更安全的类型也更加方便。例如,使用unique_ptr,您不必自己记住分配的内存大小。 vector会为您跟踪其大小。您也可以通过直接分配向量来轻松复制向量。您也不需要手动vectordelete向量。它们超出范围时将自动删除。

作为一个旁注,我建议摆脱使用free()打印换行符的习惯。 endl刷新流,而不仅仅是打印换行符。如果使用它,您将不断刷新输出流,这是一个缓慢的操作。您几乎不需要冲洗流,在这种情况下,如有需要,您可以使用endl手动进行冲洗。

答案 1 :(得分:0)

在第一种情况下,您将使用指针的大小,在第二种情况下,将使用元素的大小。 * a出于您的意图和目的,与a [0]相同。指针的大小取决于体系结构,而int的大小为4。

sizeof值在编译时评估。动态内存分配在运行时发生。要找出运行时分配的数量,可以查看是否使新运算符超载(不推荐)或按照注释的建议使用容器。

答案 2 :(得分:0)

sizeof(a)是指针的大小(在64位体系结构中通常为8),而sizeof(*a)是指向元素的大小(整数值)。 sizeof运算符返回的任何内容都不具有动态性质(因为calloc(3)返回的元素数量)

顺便说一句,在C ++中,calloc()已被弃用。它的用法保留给您必须将指针传递给C代码以及用于遗留代码的情况。使用运算符newnew [](在这种情况下为最后一个)。但是这些都不会改变任何事情,sizeof运算符将继续返回您获得的值。如果要检查返回的数组的大小,请检查传递给两个运算符的参数。