C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?

Memory size of the new allocated int in c++, Is there a different and better way to see it?

本文关键字:更好 有没有 方法 新分配 分配 内存 int      更新时间:2023-10-16

在这个程序中,我试图找出为我的指针分配了多少内存。我可以这样看到它应该是 1 吉字节,即 = 1 073 741 824 字节。我的问题是,我可以通过的唯一方法是取 int 的大小为 4 并乘以该常量数。有没有不同的方法?

#include "stdafx.h"
#include <iostream>
#include <new>
int main(){
const int gib = 268435256; //Created a constant int so I could allocate 1 
//Gib memory
int *ptr = new int [gib];
std::cout << sizeof (int)*gib << std::endl;
std::cout << *ptr << std::endl;
std::cout << ptr << std::endl;
try {
}catch (std::bad_alloc e) {
std::cerr << e.what() << std::endl;
}
system("PAUSE");
delete[] ptr;
return 0;
}

不,没有办法。编译器在内部添加有关分配了多少内存以及new[]创建了多少元素的信息,否则它无法正确执行delete[]。但是,C++没有便携式方法来获取该信息并直接使用它。

因此,您必须在仍然知道大小时单独存储大小。

实际上,你没有,因为std::vector为你做这件事:

#include <iostream>
#include <vector>
#include <new>
int main() {
const int gib = 268435256;
try {
std::vector<int> v(gib);
std::cout << (v.capacity() * sizeof(int)) << 'n';
} catch (std::bad_alloc const& e) {
std::cerr << e.what() << 'n';
}
}

您实际上永远不应该使用new[].使用std::vector.


请注意,我使用了capacity而不是size,因为size告诉您向量表示多少项,并且该数字可以小于向量当前分配的内存支持的元素数。

也没有办法避免sizeof,因为int的大小可以在实现中有所不同。但这也不是问题,因为std::vector不会丢失其类型信息,因此您始终知道一个元素有多大。

如果是std::vector<char>std::vector<unsigned char>std::vector<signed char>,就不需要乘法了,因为这三种字符类型的sizeof保证为1。

无法从指针中检索分配的内存量。让我们暂时忘记标准容器(和智能指针)的存在,然后您可以使用封装指针和大小的结构。我能想象到的最简单的动态数组是这样的:

template <typename T>
struct my_dynamic_array {
size_t capacity;
T* data;
my_dynamic_array(size_t capacity) : capacity(capacity),data(new T[capacity]) {}
~my_dynamic_array() { delete[] data; }
const T& operator[](int i) const { return data[i];}
T& operator[](int i) { return data[i];}
};

请注意,为了演示,他只是一个基本示例,例如,您不应该复制此结构的实例,否则会发生不好的事情。但是,它可以像这样使用:

my_dynamic_array<int> x(5);
x[3] = 1;
std::cout << x[3];

即使用数组的代码中没有指针和手动内存分配,这是一件好事。实际上,仅此一项就已经是一件大事了,因为现在您可以使用RAII并且不能忘记删除内存。

接下来,您可能想要调整数组的大小,这需要更多的样板文件(再次:请持保留态度!

template <typename T>
struct my_dynamically_sized_array : my_dynamic_array<T> {
size_t size;
my_dynamically_sized_array(size_t size, size_t capacity) : 
my_dynamic_array<T>(capacity),size(size) {}
void push(const T& t) {
my_dynamic_array<T>::data[size] = t;
++size;
}
};

它可以像这样使用:

my_dynamically_sized_array<int> y(0,3);
y.push(3);
std::cout << y[0];

当然,当大小大于容量时,需要重新分配内存,并且需要更多的东西才能使这个包装器真正发挥作用(例如,能够复制会很好)。

底线是:不要做任何这些!要编写一个好的成熟的容器类,比我在这里概述的要多得多,其中大部分是样板文件,并没有真正为您的代码库增加价值,因为std::vector已经是一个围绕动态分配内存的薄包装器,它为您提供了所需的一切,同时不会对您不使用的东西施加开销。