Sla*_*zer 0 c++ arrays dynamic delete-operator
我有
int * array=new int[2];
Run Code Online (Sandbox Code Playgroud)
我想释放最后一个元素的内存,从而将分配的内存减少到只有 1 个元素。我试着打电话
delete array+1;
Run Code Online (Sandbox Code Playgroud)
但它给出了错误
*** 检测到 glibc *** skuska: free(): 无效指针: 0x000000000065a020 *
这可以在没有显式重新分配的情况下在 C++03 中完成吗?
注意:如果我想使用类而不是原始数据类型(如 int),我该如何释放内存以便也调用类的析构函数?
注2:我正在尝试实施 vector::pop_back
不要new[]为此使用表达式。这不是矢量的工作方式。你要做的是分配一块原始内存。您可以为此使用 malloc ,或者您可以使用operator new,这与 new 表达式不同。假设您使用了默认分配器,这基本上就是reserve()成员函数std::vector所做的。它不像new[]表达式那样创建任何实际对象。
当你想构造一个元素时,你可以使用placement new,将你分配的原始内存中的某个位置传递给它。当你想要销毁一个元素时,你可以直接调用它的析构函数。完成后,不要使用delete[]表达式,而是使用operator deleteif you used operator new,或者使用free()if you used malloc。
这是一个创建 10 个对象并以相反顺序销毁它们的示例。我可以按任何顺序销毁它们,但这是您在矢量实现中的做法。
int main()
{
void * storage = malloc(sizeof(MyClass) * 10);
for (int i=0; i<10; ++i)
{
// this is placement new
new ((MyClass*)storage + i) MyClass;
}
for (int i=9; i>=0; --i)
{
// calling the destructor directly
((MyClass*)storage + i)->~MyClass();
}
free(storage);
}
Run Code Online (Sandbox Code Playgroud)
pop_back 将通过简单地调用最后一个元素的析构函数并将 size 成员变量减 1 来实现。它不会,不应该(并且不能,不制作一堆不必要的副本)释放任何内存。
| 归档时间: |
|
| 查看次数: |
3170 次 |
| 最近记录: |