【问题标题】:Destructor and constructor in CC中的析构函数和构造函数
【发布时间】:2016-09-09 00:09:06
【问题描述】:

我对 C 语言非常陌生,但我正在努力完全理解它。我实现了一个堆栈 但是在制作它的析构函数和它的构造函数/初始化时发现了麻烦。 这些做得好吗? 这些是堆栈使用的结构的 typedef:

typedef struct Node{
    void* cargo;
    struct Node* next;
}Node;

typedef struct Stack{
    int size;
    Node* firstOut;
}Stack;

这些是功能:

void newStack(Stack* stack){
    stack = (Stack*)malloc(sizeof(Stack));
    stack->firstOut = NULL;
    stack->size = 0;
}

void freeStack(Stack** stack){
    empty((*stack));
    free((*stack)->top);
    (*stack)->size = 0;
    free(stack);
}

我的问题是:他们做得好吗?有适当经验的人会怎么做?

【问题讨论】:

  • 你的构造函数需要一个指针参数有什么特别的原因吗?通常,采用指针的构造函数实际上是“初始化器”,因为它们实际上并不分配任何内存,而只是将结构内的变量初始化为其默认值。
  • 你的编译器告诉你关于这段代码的什么?特别是关于free((*stack)->top);?
  • 我想做很多叠
  • “但发现麻烦”。请更具体地告诉我们您遇到了什么麻烦。这种不完整的代码很难说清楚。但是newStack 看起来不对。 stack 对函数来说是本地的,所以一旦函数退出,分配给它的缓冲区就会丢失。需要传入Stack ** 或返回stack
  • 另外,free(stack) 看起来不对,因为它不会释放您在 newStack 中分配的相同内容。

标签: c initialization destructor


【解决方案1】:

newStack 应该简单地返回它分配的堆栈指针。它不需要接收Stack* 作为参数。

stack *newStack() {
    Stack *stack = malloc(sizeof(Stack));
    if (stack != NULL) { // allocation successful
        stack->firstOut = NULL;
        stack->size = 0;
    }
    return stack;
}

freeStack 应该接收一个堆栈指针作为参数,它不需要双重间接。

void freeStack(Stack *stack) {
    empty(stack);
    free(stack->firstOut); // This isn't done by empty()?
    free(stack);
}

在释放之前不需要设置stack->size,因为内存会消失,它包含的值是无关紧要的。

【讨论】:

  • 构造函数在取消引用结果之前应该检查malloc()的结果。
猜你喜欢
  • 2011-04-03
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2012-11-14
  • 1970-01-01
  • 2013-07-07
  • 2014-05-27
相关资源
最近更新 更多