赞
踩
下面的例子来展示使用delete 与delete[].当我们删除MyClass指针时,我们必需在析构函数中用delete操作符来触发delete myObj来删除堆内存上的数据.
- #include <iostream>
- class MyClass
- {
- public:
- MyClass()
- {
- std::cout << "default constructor" << std::endl;
- }
- MyClass(int s):myArray(new double[s])
- {
- std::cout << "constructor" << std::endl;
- for(int i = 0; i < s; ++i) myArray[i] = 0;
- }
- ~MyClass()
- {
- // this will be called @"delete myObj"
- std::cout << "destructor" << std::endl;
- delete[] myArray;
- }
- private:
- double *myArray;
- };
-
- int main(int argc, char** argv)
- {
- MyClass *myObj = new MyClass(5); //'5' here is the number of elements of array of double
- delete myObj; // this calls destructor
- return 0;
- }
如果我们不使用数据版本的delete,我们的程序可能会处于诡异的状态。在一些编译器中,只是第0个元素的析构函数被调用。因为编译器只知道删除了一个对象的指针,另一方便内存错误可能发生,因为new与new[]是完全不同的内存审请方式。
析构函数只在数组中元素是普通对象时,如果是一个数组指针,我们还是需要去分别删除数据组每一个元素的,就象我们分别审请时的样子,请看下面代码的示例:
int main(int argc, char** argv)
{
MyClass**myClassPtrArray = new MyClass*[5];
//Allocate an object for each pointer.
for(int i = 0; i < 5; i++)
myClassPtrArray[i]= new MyClass();
//Use myClassPtrArray.
//Delete each allocated object.
for(int i = 0; i < 4; i++)
deletemyClassPtrArray[i];
//Delete the array itself.
delete[]myClassPtrArray;
}
C 语言没有提供new和delete操作.使用free来释放内存,我们需要使用函数处理内存。这些函数定义在<stdlib.h>中。
void* malloc(size_t sz) /* allocate sz bytes */
void free(void *p) /* deallocate the memorypointed to by p */
void* calloc(size_t n, size_t sz); /* allocaten*sz bytes initialized to 0 */
void* realloc(void* p, size_t sz); /*reallocate the memory pointed to by p
tp aspace of size sz */
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。