我刚刚开始学习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倍呢?
谢谢!
答案 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'.
,new
,delete
,malloc()
或calloc()
。进行手动内存管理需要更多代码,并且容易出错。请使用free()
之类的容器以及vector
和shared_ptr
之类的智能指针来减少内存和其他资源泄漏的机会。这些更安全的类型也更加方便。例如,使用unique_ptr
,您不必自己记住分配的内存大小。 vector
会为您跟踪其大小。您也可以通过直接分配向量来轻松复制向量。您也不需要手动vector
或delete
向量。它们超出范围时将自动删除。
作为一个旁注,我建议摆脱使用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代码以及用于遗留代码的情况。使用运算符new
和new []
(在这种情况下为最后一个)。但是这些都不会改变任何事情,sizeof
运算符将继续返回您获得的值。如果要检查返回的数组的大小,请检查传递给两个运算符的参数。