Foo* set = new Foo[100];
// ...
delete [] set;
Run Code Online (Sandbox Code Playgroud)
您没有将数组的边界传递给delete[].但是这些信息存储在哪里?它是标准化的吗?
每次有人delete[]在这里问一个问题时,总会有一个非常笼统delete[]的回答:“ C++ 就是这样做的,使用”。来自普通的 C 背景,我不明白为什么需要一个不同的调用。
使用malloc()/free()您的选择是获取指向连续内存块的指针并释放连续内存块。实现领域中的某些东西会根据基地址知道您分配的块的大小,以便您何时必须释放它。
没有功能free_array()。我在与此相关的其他问题上看到了一些疯狂的理论,例如调用delete ptr只会释放数组的顶部,而不是整个数组。或者更正确的是,它不是由实现定义的。当然……如果这是 C++ 的第一个版本,并且您做出了一个有意义的奇怪设计选择。但是为什么 with$PRESENT_YEAR的 C++ 标准没有被重载???
似乎 C++ 添加的唯一额外的一点是遍历数组并调用析构函数,我认为这可能是它的症结所在,它实际上是使用一个单独的函数来为我们节省单个运行时长度查找,或者nullptr在列表的末尾,以换取折磨每个新的 C++ 程序员或程序员,他们有一个模糊的一天并且忘记了有一个不同的保留字。
如果除了“这就是标准所说的并且没有人质疑它”之外还有其他原因,有人可以一劳永逸地澄清吗?
使用单个关键字实现删除数组难吗?效率低下吗?
是否有可能做这样的事情:
int *iarray = new int[10];
.....
//do something with it
.....
Run Code Online (Sandbox Code Playgroud)
然后为了轻松删除第一个元素,请执行以下操作:
delete iarray;
iarray++;
Run Code Online (Sandbox Code Playgroud)
似乎删除(没有 [] )仍然删除整个数组。如果可能的话,删除第一个元素将是非常棘手和聪明的方法。这个想法不是我的,我在某处看到过,但它对我不起作用。难道我做错了什么?
假设我们有以下课程
class Data
{
public:
Data() : i(new int) { *i = 0; }
~Data() { delete i; }
private:
int *i;
};
Run Code Online (Sandbox Code Playgroud)
现在我们创建100个Data类型元素的数组
Data* dataArray = new Data[100];
Run Code Online (Sandbox Code Playgroud)
我们知道operator new会为100个对象调用Data构造函数,因为它知道创建了多少个对象,现在让我们删除这个数组,如果我们说delete dataArray只调用第一个对象的析构函数,即使我们知道100个对象的内存我们被释放 - 将导致内存泄漏 - 并且因为它们被分配为一个块,但是如果我们说delete[] dataArray将调用100个对象的析构函数,但这是一个dynmaic内存并且我没有指定那里有多少个对象我知道数组没有任何开销来知道其中有多少对象,那么运行时环境如何知道在释放内存之前要销毁的对象数量?
这看起来很简单,但我的朋友和我一起辩论,下面的程序会调用UB.但我认为他是不正确的.考虑以下计划:
#include <iostream>
int main()
{
int* p=new int[3]();
int* q=p;
for(int i=0;i<3;i++)
std::cout<<q[i]<<' ';
delete[] q;
std::cout<<'\n';
}
Run Code Online (Sandbox Code Playgroud)
这个程序的行为是否定义得很好?如果我写delete [] p会发生什么?而不是删除[] q; ?有效吗?
如果我需要一个二进制缓冲区对象,
比如用于TCP/UDP通信的对象,
那么我将在c ++中使用什么?
vector<unsigned char> ?
std::string? - std :: string可以容纳0字节,与普遍看法相反,所以它可以用来保存二进制数据
new char[] ?
malloc() ?
有没有人看到用于二进制缓冲区的std :: vector?
我没看到.为什么?表现?
我确实看到malloc()经常用于二进制缓冲区.
在C++中.任何人都可以确认吗?解释一下?
谢谢
int* i = new int[4];
delete[] i;
Run Code Online (Sandbox Code Playgroud)
正如HadeS所说,它将保存已分配多少内存的信息?在哪里?它必须保存在内存中,或者可能在指针附近i.