【发布时间】:2012-03-20 23:34:11
【问题描述】:
我知道指针的大小是固定的(而不是它指向的数据的大小)。现在鉴于此,假设我在全局范围内有一个数据向量,并且我声明了一个指向指向部分/全部全局数据的指针向量的指针,这将额外使用多少内存(RAM)?我在这里完全不知所措,当然会感谢一些想法/建议。我希望无论数据的复杂性如何,额外的内存消耗只是向量的大小乘以指针的固定大小(例如 8 个字节);因为它指向的数据存在于全球范围内(即,没有分配新数据;希望我已经清楚地解释了我的想法)。
表达我的问题的一些伪代码如下所示:
std::vector<data> global_data;
std::vector<data*>* my_data = new std::vector<data*>(); //-Is this even valid?
//-Now populate the vector with pointers to data in global_data
for(int i=0; i<global_data.size(); ++i) {
my_data->push_back(&global_data[i]);
}
那么我的问题是 RAM 中有多少额外的内存(即超过创建 global_data 已经使用的内存)被 m_data 用完了?
【问题讨论】:
-
不要……使用……
vectors……的指针……或指向vectors的指针。这几乎总是错误的做法。您确实意识到它会阻止vector为您管理内存,对吧? -
Ed.. 我相信有办法解决这个问题(无论如何,这不是我的特定目的的问题).. 但是继续,请让我知道举例说明你的意思。
-
所以,
vector的全部意义在于它管理动态分配和释放。当它的析构函数运行时,它会在它动态分配的项目上调用delete。但是,如果您正在存储指针,那么它是分配指针,而不是它指向的对象,因此当vector超出范围时不会被删除。同样,如果你存储一个指向vector的指针,那么你必须手动调用delete。这称为 RAII(任何 C++ 程序员都需要了解 RAII),您正在规避vectors 为您安全管理内存的能力。 -
您只是没有正确使用它。
vector本身又小又便宜,不需要动态分配。它在幕后动态分配其元素,所以不用担心。