1. 使用 new 得来的空间,必须用 delete 来释放;使用 new [] 得来的空间,必须用 delete [] 来释放。彼此之间不能混用。用 new [] 分配出连续空间后,指针变量“指向”该空间的首地址。
2. 指针通过 new 或 new[] ,向系统“申请”得到一段内存空间,这段内存空间必须在不需要将它释放了。
3. 一个指针被删除时,应指向最初的地址
4. 已释放的空间,不可重复释放
1, 2 的使用错误例子
int* p = new int[100];
int girl[100];
p = girl;
delete [] p;
错误一: 该释放的new int[100] 没有使用
错误二: girl[1]00]本应由系统自行释放,但我们要强行释放
主意P的指向发生了变化
3的错误使用例子
int main(){
int* p = new int[3];
*p=1;
p++;
*p = 2;
delete []p; //P的位置不是指向初始位置
}
==15033== Invalid free() / delete / delete[]
==15033== at 0x4A056AF: operator delete[](void*) (vg_replace_malloc.c:368)
==15033== by 0x40061E: main (test3.cpp:15)
==15033== Address 0x512e044 is 4 bytes inside a block of size 12 alloc'd
==15033== at 0x4A065BA: operator new[](unsigned long) (vg_replace_malloc.c:264)
==15033== by 0x4005E9: main (test3.cpp:3)
==15033==
==15033==
==15033== HEAP SUMMARY:
==15033== in use at exit: 12 bytes in 1 blocks
==15033== total heap usage: 1 allocs, 1 frees, 12 bytes allocated
==15033==
==15033== 12 bytes in 1 blocks are definitely lost in loss record 1 of 1
==15033== at 0x4A065BA: operator new[](unsigned long) (vg_replace_malloc.c:264)
==15033== by 0x4005E9: main (test3.cpp:3)
==15033==
==15033== LEAK SUMMARY:
==15033== definitely lost: 12 bytes in 1 blocks
==15033== indirectly lost: 0 bytes in 0 blocks
==15033== possibly lost: 0 bytes in 0 blocks
==15033== still reachable: 0 bytes in 0 blocks
==15033== suppressed: 0 bytes in 0 blocks
==15033==
==15033== For counts of detected and suppressed errors, rerun with: -v
==15033== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4)
正确的释放
当我们的指针指向变化很多次时,在释放前要保证一步不错地一一退回,会比较困难。所以另一方法是在最初时“备份”一份。在释放时,直接释放该指针即可。
int main(){
int* p = new int[3];
int* pbak;
pbak=p;
*p=1;
p++;
*p = 2;
delete [] pbak;
}
分享到:
相关推荐
本文将深入探讨“new”和“delete”操作符、指向连续空间的指针、数组以及内存的释放和申请,这些都是C++内存管理的基础。 首先,`new`和`delete`是C++中的动态内存分配和释放操作符。`new`用于在堆上为对象分配...
1. 释放内存:确保在不再需要指针数组中指向的内存时进行释放,以防止内存泄漏。 2. 空指针:未初始化的指针数组元素可能会导致空指针引用,需谨慎处理。 3. 指针数组和数组指针的区别:数组指针是一个指针,它...
假设我们需要一个指针数组,每个指针指向一个整数。 ```c #include #include int main() { int *ptrs[3]; // 指针数组 for (int i = 0; i ; i++) { ptrs[i] = (int *)malloc(sizeof(int)); *ptrs[i] = i + 1...
`,这里的`one`是一个指针数组,它指向一个数组,使用`delete[]`操作符可以删除该数组。 容易混淆的概念 在编程中,容易混淆的概念是指针数组和普通数组的声明方式。例如:`area one[10000];`、`area *one[10000];...
指针与指针数组也是常见的组合,指针数组可以存储一系列的指针,这样可以方便地管理和操作一组对象。例如,`int *ptrs[10];`定义了一个可以存储10个整型指针的数组。 最后,要特别注意指针的生命周期和空指针。未...
在给定的“cpp.rar_cpp指针数组”主题中,我们将深入探讨指针数组的概念、如何声明和使用它们,以及相关的编程技巧。 首先,让我们定义什么是指针数组。一个指针数组本质上是一个数组,其每个元素都是一个指针。...
指针数组在C++编程中是一个重要的概念,它涉及到对内存管理...总之,理解指针数组、数组指针和函数指针的概念,以及如何在堆上正确地分配和释放内存,是C++编程的基础。掌握这些知识点有助于编写更加高效和安全的代码。
本文将深入探讨如何使用`new`来创建二维数组和指针数组,并提供相关实例代码。 ### 1. 使用`new`创建二维数组 二维数组在C++中可以被视为数组的数组,通常表示为`int[][]`。然而,由于C++不支持直接动态分配多维...
申请空间时,每一级的大小都可以动态变化。访问时,使用 p[i][j][k]。释放空间时,需要按照从低级到高级反方向释放,否则会造成内存泄露。 四、数组和指针的区别 数组和指针并不相同。声明相当于普通的声明,而...
这里需要注意的是,在释放内存时,不仅要释放每一行的空间,还要释放整个指针数组的空间。 #### 5. 两维都未知,一次分配内存(保证内存连续) 同样,为了保持内存连续性,也可以在两维长度均未知的情况下一次性...
在C++编程中,指针数组是一种非常重要的概念,它允许我们存储一组指向不同类型对象的指针。在这个例子中,我们将探讨如何使用指针数组实现经典的冒泡排序算法。冒泡排序是一种简单的排序方法,它通过重复遍历待排序...
4. 动态内存分配和释放,如使用`new`和`delete`操作符创建和释放一维数组。 5. 指针算术和数组索引的关系。 6. 避免常见的指针和数组错误,如未初始化的指针、越界访问等。 最后,文件名中出现的.exe和.obj文件通常...
1. 使用指针数组来实现三整数的排序。 ```c void swap(int *pt1,int *pt2){ int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; } void exchange(int *q1,int *q2,int *q3){ if(*q1<*q2)swap(q1,q2); if(*q1<*q3)...
在C++中,申请和释放堆中分配的存储空间,分别使用new和delete的两个运算符来完成。new运算符返回的是一个指向所分配类型变量(对象)的指针,对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象...
例如,如果我们要创建一个指向整数的指针数组,可以这样做: ```cpp int* ptrArray[5]; ``` 这将创建一个包含5个元素的数组,每个元素都是一个指向整数的指针。我们可以使用这个指针数组来存储对不同整数数组的...
2. 二维指针实现二维数组:这种方法创建的是真正意义上的二维数组,每个元素也是指针,指向各自的一维数组: ```cpp int **arr = new int*[m]; for (int i = 0; i ; ++i) { arr[i] = new int[n]; } ``` 同样,用...
对于更高级的使用场景,例如动态分配二维数组的内存,C++提供了 `new` 和 `delete` 运算符来动态申请和释放内存。例如,可以使用 `int **connect = new int*[N];` 来创建一个指针数组,然后通过循环为每个指针分配...
`new`会返回指向数组首元素的指针,我们可以像操作普通数组一样来访问和修改这些元素。 对于多维数组,C++提供了一种类似于声明多维数组的方式来动态创建。比如,创建一个3x4的二维整型数组可以这样写: ```cpp ...
对于二维数组,我们有两层指针:一层是指向数组的指针,另一层是数组中的元素指针。 二维数组的基本结构是这样的: ```cpp int arr[行数][列数]; ``` 例如,一个3x4的二维数组可以这样定义: ```cpp int arr[3]...