微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C ++类指针动态数组解除分配问题

如何解决C ++类指针动态数组解除分配问题

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define ROW 1

class Foo
{
public:
    Foo()
    {
        this->dummy = new unsigned int[100];
    }
    ~Foo()
    {
        delete[] this->dummy;
        this->dummy = NULL;
    }

    unsigned int* dummy;
};

Foo** allocate()
{
    Foo** foo_array = NULL;
    foo_array = new Foo * [ROW]; //Create space for Foo addresses (row)

    for (int i = 0; i < ROW; i++)
        foo_array[i] = new Foo; //Create and allocate Foo for each address space(col)

    return foo_array;
}

int deallocate(Foo* foo_array[ROW])
{
    if (foo_array != NULL)
    {
        for (int i = 0; i < ROW; i++)
            delete foo_array[i];
        delete[] foo_array;
        
        foo_array = NULL;

        return 1;
    }

    return 0;
}

void main()
{
    Foo** foo_array = NULL;

    foo_array = allocate();
    deallocate(foo_array);
    
    if (foo_array != NULL)
        printf("not null something wrong\n");
    system("pause");
}

在main()函数中,一旦由deallocate(Foo * foo_array [ROW])函数执行了释放,则foo_array应该指向NULL。

但是,在deallocate(Foo * foo_array [ROW])函数中,

foo_array = NULL;

上面的语法似乎指向NULL,但是在main()函数中, foo_array不是指向NULL。

所以,我试图在deallocate(Foo * foo_array [ROW])函数中更改以上语法,

foo_array = NULL; => (*foo_array) = NULL;

它吐出写访问冲突错误

哪里出错了?

解决方法

正确的语法为foo_array = deallocate (foo_array);,而您的deallocate应该返回NULL

,

我没有任何理由将foo_array声明为指向指针的指针。在您的代码中,您正在按值传递指针。这意味着您可以更改指针所指向的内容,但不能更改指针的值。您可以使用参考来解决问题。

#include <cstdio>

#define ROW 1

class Foo
{
public:
    Foo()
    {
        this->dummy = new unsigned int[100];
    }
    ~Foo()
    {
        delete[] this->dummy;
        this->dummy = NULL;
    }

    unsigned int *dummy;
};

void allocate(Foo *&foo_array)
{
    foo_array = new Foo[ROW];
}

void deallocate(Foo *&foo_array)
{
    delete[] foo_array;
    foo_array = nullptr;
}

int main()
{
    Foo *foo_array = nullptr;

    allocate(foo_array);
    deallocate(foo_array);
    
    if (foo_array != nullptr)
        printf("not null something wrong\n");
}

当然,您可以使用STL容器或智能指针使代码更简单

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。