我想知道我为一个程序编写的类是否会泄漏内存。
这是我的实施,
BubbleSort.h有3个私有变量:
int arrSize = Array Size
int* intArray = Original Array
int* narr = Bubble Sorted Array
BubbleSort.cpp
#include "BubbleSort.h"
BubbleSort::BubbleSort(int size, int* arr)
{
arrSize = size;
intArray = arr;
printf("BubbleSort();\n");
}
// Object Destruction
BubbleSort::~BubbleSort()
{
free(narr);
}
int* BubbleSort::Sort() {
int swap = 0;
narr = (int*)malloc(arrSize * sizeof(int));
for (int i = 0; i < arrSize; i++) {
narr[i] = intArray[i];
}
for (int i = 0; i < arrSize - 1; i++) {
for (int j = (i + 1); j < arrSize; j++) {
if (narr[j] < narr[i]) {
swap = narr[i];
narr[i] = narr[j];
narr[j] = swap;
}
}
}
return narr;
}
这是我的主文件
#include "main.h"
#include "classes.h"
int main(int argc, char* argv[]) {
const int size = 10;
int arr[size] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
BubbleSort sort = BubbleSort::BubbleSort(size, arr);
int* narr = sort.Sort();
for (int i = 0; i < size; i++) {
printf("%d > %d\n", arr[i], narr[i]);
}
printf("Hello World.\n");
getchar();
}
该程序在运行期间会泄漏内存吗?
当我运行代码时,我检查了BubbleSort实例'sort'是否正在销毁,但是只有在应用程序运行完毕时才会这样。我目前正在学习如何在我的编程课程中使用malloc()
和free()
,并有一些空闲时间,所以我决定制作一个冒泡排序课并想试验它!所以我希望代码中没有太多错误(与指针的使用有关)。
除非您使用C代码,否则不应使用malloc
和free
。尽量避免使用new
和delete
,因为C ++有许多更简单的模式,保证不泄漏并且速度快。想想std::vector
,如果vector
不够好,可以用std::unique_ptr<int[]> narr
来考虑std::make_unique<int[]>(size)
。
您的程序不会泄漏,也不会因为纯粹的运气而崩溃。为了避免泄漏,你的班级应该对记忆有明确的不变性,而且没有。无法知道narr
何时有无效指针,或何时指向必须释放的内存。结果是以下泄漏:
int arr1[size] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
BubbleSort sort = BubbleSort::BubbleSort(size, arr1);
int* narr = sort.Sort();
narr = sort.Sort();
以下是未定义的行为(在未初始化的指针上释放):
int arr1[size] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
BubbleSort sort = BubbleSort::BubbleSort(size, arr1);
return 0;
最简单的方法(并在99.9%的情况下纠正)来处理这个问题,就是定义所有权。你事先决定谁拥有什么对象。有了std::vector
和std::unique_ptr
,语言就会为你决定。如果您没有明确的行动,该语言不会让您意外转移std::unique_ptr
的所有权。如果你犯了一个错误,编译器只会给你一个错误。
malloc
, free
, printf
, and raw pointers everywhere. However, you should remember that this is not idiomatic C++. Sooner or later you must move to C++ idioms like RAII, classes that have clear ownership and invariant, and use C++ library instead of C.
这种分配模式非常糟糕。是的,你提供的程序不会泄漏,但如果你不重新考虑你的模式,你会泄漏更大的程序。
要么只在构造函数(RAII)中分配narr
,要么在析构函数中释放但在调用函数(旧学校)中释放,或者完全删除对象并将size
和arr
传递给sort()
。
很快就会开始使用标准模板库,但这是另一天的话题。
正如Sam Varshavick指出的那样,如果您创建其中一个并且不调用sort,那么您将在析构函数中崩溃。我提供的任何方法都将解决这个问题,在构造函数中将narr
初始化为NULL
。