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 数组的大小,但您需要了解 a
和 b
是 而不是 数组。它们是指向 int
的指针。如果 sizeof(int)
是 4,那么 sizeof(*a)
也将是 4,这在编译时就已经知道了。
话虽如此,您不需要在 C++ 中使用 C 库函数 malloc()
和 calloc()
。如果您需要手动分配内存,请使用 new
和 delete
:
a = new int;
b = new int[5];
如果你需要像 calloc
那样做 zero-initialization,只需使用 ()
到 default-construct 分配的整数:
a = new int();
b = new int[5]();
而不是 free()
,使用 delete
或 delete[]
,具体取决于之前调用 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++ 代码不应调用 new
、delete
、malloc()
、calloc()
或 free()
。进行手动内存管理需要更多代码,并且 error-prone。使用像 vector
这样的容器和像 shared_ptr
和 unique_ptr
这样的智能指针来减少内存和其他资源泄漏的机会。这些更安全的类型也更方便。例如,使用 vector
,您不必自己记住分配的内存大小。 vector
会为您跟踪其大小。您还可以通过直接分配向量来轻松复制向量。您也不需要手动 delete
或 free()
矢量。它们超出范围时会自动删除。
作为一个side-note,我建议改掉使用endl
打印换行符的习惯。 endl
刷新流,它不只是打印换行符。如果你使用它,你将不断地刷新输出流,这是一个缓慢的操作。您很少需要刷新流,在这种情况下,如果需要,您可以使用 << flush
手动执行此操作。
sizeof(a)
是指针的大小(在 64 位架构中通常为 8),而 sizeof(*a)
是指向元素的大小(整数值)。 sizeof
运算符返回的任何内容都没有动态性质(因为 calloc(3)
返回的元素数量)
顺便说一句,calloc()
在 C++ 中被强烈反对。它仅用于必须将指针传递给 C 代码和遗留代码的情况。使用运算符 new
和 new []
(本例中为最后一个)。但是其中的 none 会改变事情, sizeof
运算符将继续返回您获得的值。如果要检查返回数组的大小,请检查传递给两个运算符的参数。
我刚开始学习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 数组的大小,但您需要了解 a
和 b
是 而不是 数组。它们是指向 int
的指针。如果 sizeof(int)
是 4,那么 sizeof(*a)
也将是 4,这在编译时就已经知道了。
话虽如此,您不需要在 C++ 中使用 C 库函数 malloc()
和 calloc()
。如果您需要手动分配内存,请使用 new
和 delete
:
a = new int;
b = new int[5];
如果你需要像 calloc
那样做 zero-initialization,只需使用 ()
到 default-construct 分配的整数:
a = new int();
b = new int[5]();
而不是 free()
,使用 delete
或 delete[]
,具体取决于之前调用 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++ 代码不应调用 new
、delete
、malloc()
、calloc()
或 free()
。进行手动内存管理需要更多代码,并且 error-prone。使用像 vector
这样的容器和像 shared_ptr
和 unique_ptr
这样的智能指针来减少内存和其他资源泄漏的机会。这些更安全的类型也更方便。例如,使用 vector
,您不必自己记住分配的内存大小。 vector
会为您跟踪其大小。您还可以通过直接分配向量来轻松复制向量。您也不需要手动 delete
或 free()
矢量。它们超出范围时会自动删除。
作为一个side-note,我建议改掉使用endl
打印换行符的习惯。 endl
刷新流,它不只是打印换行符。如果你使用它,你将不断地刷新输出流,这是一个缓慢的操作。您很少需要刷新流,在这种情况下,如果需要,您可以使用 << flush
手动执行此操作。
sizeof(a)
是指针的大小(在 64 位架构中通常为 8),而 sizeof(*a)
是指向元素的大小(整数值)。 sizeof
运算符返回的任何内容都没有动态性质(因为 calloc(3)
返回的元素数量)
顺便说一句,calloc()
在 C++ 中被强烈反对。它仅用于必须将指针传递给 C 代码和遗留代码的情况。使用运算符 new
和 new []
(本例中为最后一个)。但是其中的 none 会改变事情, sizeof
运算符将继续返回您获得的值。如果要检查返回数组的大小,请检查传递给两个运算符的参数。