如何正确删除指向数组的指针。

16 浏览
0 Comments

如何正确删除指向数组的指针。

我刚接触C++,对于数组和指针感到困惑。有人能告诉我如何正确地删除指针吗?比如说,\n

int *foo;
foo = new int[10];
delete foo;

\n或者\n

delete [] foo;

\n谢谢。

0
0 Comments

使用new []操作符分配数组对象时,必须使用delete []操作符,因此非数组new只能与非数组delete一起使用。

问题的原因是代码中使用了delete [] a;来释放数组a所占用的内存,但是却使用了非数组delete b;来释放非数组b所占用的内存。这样做是错误的,会导致程序出现未定义的行为。

要正确删除指向数组的指针,应该使用delete []操作符,而不是delete操作符。正确的解决方法是将delete b;替换为delete [] b;,即:delete [] a;delete [] b;

这样,内存就会正确地被释放,避免了内存泄漏和未定义行为的问题。

0
0 Comments

如何正确删除指向数组的指针

在C++中,当我们使用new关键字为数组分配内存时,我们需要使用delete[]关键字来释放这块内存。但是,有时我们可能会犯错误,使用了错误的delete关键字来释放指向数组的指针。这可能导致内存泄漏或无法正确调用析构函数。

现代编译器确实需要我们使用正确的delete运算符,否则它们可能会泄漏内存或无法运行适当的析构函数。

即使编译器能够正确处理delete,我认为使用delete[]关键字仍然是更好的实践方法,无论是在遇到不支持正确处理的编译器的情况下,还是作为意图声明的一种方式。

编译器可能不会泄漏内存,但是如果没有使用[],它们可能不会调用析构函数。

我从来没有见过一个编译器允许你在需要使用delete[]时使用delete。当我这样做时,它们总是会产生错误。

如果你使用了错误的delete,它确实会泄漏内存。但是由于你使用了错误的delete,你已经破坏了内存管理例程使用的内部内存结构。因此,任何试图监视内存泄漏的工具可能不会报告这个问题。

对于具有平凡析构函数的类型,它们可能不会泄漏内存。但是对于具有非平凡析构函数的用户定义类型,情况就不同了,因为delete不会调用所有的析构函数。

在我尝试这个实验的时候,大约在10年前,我尝试了许多不同的编译器,但没有找到一个在你错误地省略了[]时实际泄漏内存的编译器。然而,现代的编译器和libc++确实很在乎这个问题。

至少Visual C++ 8.0可以检测到数组/非数组new和delete之间的不匹配(当使用/analyze开关调用时)。如果使用了错误的delete(对于具有析构函数的类),生成的程序将会泄漏内存。

因此,为了避免内存泄漏和无法正确调用析构函数的问题,我们应该始终使用delete[]来释放指向数组的指针。

0
0 Comments

如何正确删除指向数组的指针

在使用new和delete时,我们需要注意它们之间的匹配关系。在C++中,new操作符和delete操作符是一对,new[]操作符和delete[]操作符也是一对。使用new操作符分配的内存需要使用delete操作符来释放,而使用new[]操作符分配的数组内存需要使用delete[]操作符来释放。

然而,更好的做法是尽量避免使用new[]操作符,而是使用std::vector或std::deque来代替。因为在大多数情况下,使用std::vector或std::deque更为方便和高效。

如果我们想要创建一个类似于vector或deque的容器,也不建议使用new[]操作符。通常的做法是使用operator new来分配原始的存储空间,然后使用placement new操作符在该空间中创建对象,并显式调用对象的析构函数来销毁对象。

以std::vector为例,它支持reserve函数来分配额外的空间,但这些空间并不会立即转化为对象,直到调用push_back或emplace_back函数来创建实际的对象。

而当使用new[]操作符时,它会为指定类型的对象创建并填充整个分配的空间。无法像push_back一样向集合中添加新的对象,因为集合始终是“满的”。我们只能够分配一个比旧集合更大的新集合(这样每次添加元素都是O(N)的时间复杂度,而不是std::vector支持的摊销O(1)时间复杂度,效率大大降低)。

如果我们想要构建一个字符串类或其他有用的类,全面禁用new是不合理的。应该禁用的是new[],而不是new。一个集合类(包括字符串)应该直接调用::new(size_t)来分配内存。当使用new[]时,它会创建一个对象数组,即分配并构造所有这些位置的对象。而集合类不应该在空闲空间中创建对象(对于字符串来说毫无意义,如果对象的构造成本较高则会造成负面影响)。相反,它应该分配未初始化的存储空间,然后使用placement new在该空间中创建对象。

0