C++ 编程,动态内存不能正常使用 malloc 和 calloc

C++ programming, dynamical memory is not working properly using malloc and calloc

我刚开始学习C++,遇到了一个在网上找不到的问题,希望你能帮助我。

这是我的代码:

int* a;
int* b;

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

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

什么编译器returns我是:8、8。 如果我使用:

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

编译器 returns 4, 4.

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

我做错了什么?为什么 b 的大小不是 20,因为如果 int 是 4 个字节长,它会大 5 倍?

谢谢!

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

sizeof 值在编译时求值。动态内存分配发生在 运行 时间。要找出在 运行 时分配的数量,您可以查看重载 new 运算符(不推荐)或使用评论建议的容器。

sizeof(*a)sizeof(*b) 总是等于 4。您似乎希望它们达到 return 数组的大小,但您需要了解 ab 而不是 数组。它们是指向 int 的指针。如果 sizeof(int) 是 4,那么 sizeof(*a) 也将是 4,这在编译时就已经知道了。

话虽如此,您不需要在 C++ 中使用 C 库函数 malloc()calloc()。如果您需要手动分配内存,请使用 newdelete:

a = new int;
b = new int[5];

如果你需要像 calloc 那样做 zero-initialization,只需使用 () 到 default-construct 分配的整数:

a = new int();
b = new int[5]();

而不是 free(),使用 deletedelete[],具体取决于之前调用 new 的方式:

delete a;    // Note: no '[]'
delete[] b;  // Needs '[]'

不过,这里不需要手动分配内存。只需使用 std::vector<int>:

#include <vector>
// ...

std::vector<int> a(5); // 5 int elements, zero-initialized.
std::cout << a.size() << '\n'; // Will print '5'.

根据经验,您的 C++ 代码不应调用 newdeletemalloc()calloc()free()。进行手动内存管理需要更多代码,并且 error-prone。使用像 vector 这样的容器和像 shared_ptrunique_ptr 这样的智能指针来减少内存和其他资源泄漏的机会。这些更安全的类型也更方便。例如,使用 vector,您不必自己记住分配的内存大小。 vector 会为您跟踪其大小。您还可以通过直接分配向量来轻松复制向量。您也不需要手动 deletefree() 矢量。它们超出范围时会自动删除。

作为一个side-note,我建议改掉使用endl打印换行符的习惯。 endl 刷新流,它不只是打印换行符。如果你使用它,你将不断地刷新输出流,这是一个缓慢的操作。您很少需要刷新流,在这种情况下,如果需要,您可以使用 << flush 手动执行此操作。

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

顺便说一句,calloc() 在 C++ 中被强烈反对。它仅用于必须将指针传递给 C 代码和遗留代码的情况。使用运算符 newnew [](本例中为最后一个)。但是其中的 none 会改变事情, sizeof 运算符将继续返回您获得的值。如果要检查返回数组的大小,请检查传递给两个运算符的参数。