找不到问题的确切答案:
释放内存并再次分配是不使用 cstdlib 重新分配内存的唯一方法吗?如果不是这样,那么可能的解决方案是什么?
提前致谢。
找不到问题的确切答案:
释放内存并再次分配是不使用 cstdlib 重新分配内存的唯一方法吗?如果不是这样,那么可能的解决方案是什么?
提前致谢。
也许你的意思是当你用内存加载 std::vector (或其他容器)时,删除所有元素,然后调用 clear 释放内存,然后在其中分配新项目,从而分配更多内存?在这种情况下,随着容器中内存的增长,容器可能会根据需要重新分配其内存。
既然你提到你正在创建一个向量:
在我们需要这样做的项目中,因为我们没有向量实现(嵌入式),通常分配一组比最初需要的更大的内存块,以防止不断的内存重新分配,这会产生大量的复制成本并导致内存碎片化。一个常见的方案是为应用程序分配一个“合理的”大小,然后在达到限制时将该大小加倍。如果用户曾经请求减小缓冲区的大小,或者在初始化时设置为某个大小,那么我们将忽略此启发式并使用请求的大小。
如果您正在实现自己的向量类,那么您确实需要正确复制向量的内容,而不是 use realloc
,因为您不知道对象在被复制时本身在做什么(或在 C++11 中相关案件,搬家)。例如,假设您有一个执行以下操作的对象:
class B;
class A
{
private:
B* bp;
public:
A(B *p) : bp(p)
{
}
};
class B
{
public:
A a;
B() : A(this)
{
...
}
};
MyVector<B> v;
如果将对象复制到不同的地址,而不调用构造函数,则bp
指针A
将指向某个“随机”位置。试图找到这将是一个非常讨厌的错误。
[是的,上面的类中缺少很多东西——这并不意味着完整的类声明等]