这个C ++类泄漏内存吗?

问题描述 投票:1回答:2

我想知道我为一个程序编写的类是否会泄漏内存。

这是我的实施,

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++ memory-management memory-leaks
2个回答
2
投票

除非您使用C代码,否则不应使用mallocfree。尽量避免使用newdelete,因为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::vectorstd::unique_ptr,语言就会为你决定。如果您没有明确的行动,该语言不会让您意外转移std::unique_ptr的所有权。如果你犯了一个错误,编译器只会给你一个错误。


Side note: if you want to learn C++, when you come from C background, it might be easier to start with 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.

1
投票

这种分配模式非常糟糕。是的,你提供的程序不会泄漏,但如果你不重新考虑你的模式,你会泄漏更大的程序。

要么只在构造函数(RAII)中分配narr,要么在析构函数中释放但在调用函数(旧学校)中释放,或者完全删除对象并将sizearr传递给sort()

很快就会开始使用标准模板库,但这是另一天的话题。

正如Sam Varshavick指出的那样,如果您创建其中一个并且不调用sort,那么您将在析构函数中崩溃。我提供的任何方法都将解决这个问题,在构造函数中将narr初始化为NULL

© www.soinside.com 2019 - 2024. All rights reserved.