【问题标题】:Storage duration when calling constructor from another function从另一个函数调用构造函数时的存储持续时间
【发布时间】:2015-07-23 13:26:09
【问题描述】:

我有一个如下所示的结构:

struct matrix {
    size_t nrow;
    size_t ncol;
    double *data;
};

以及相应的构造函数:

struct matrix *matrix_create(const size_t nrow, const size_t ncol)
{
    struct matrix *m;

    m = malloc(sizeof(struct matrix));
    if (!m) {
        fprintf(stderr, "Memory allocation failed\n");
        return NULL;
    }
    m->data = malloc(sizeof(double) * nrow * ncol);
    if (!m->data) {
        fprintf(stderr, "Memory allocation failed\n");
        return NULL;
    }

    m->nrow = nrow;
    m->ncol = ncol;

    return m;
}

现在说我想要另一个函数调用构造函数并返回指向struct的指针:

struct matrix *matrix_dostuff(const struct matrix *m1, const struct matrix *m2)
{
    struct matrix *dostuff =
        matrix_create(m1->nrow * m2->nrow, m1->ncol * m2->ncol);

    /* do stuff */

    return dostuff;
}

这种定义明确的行为又名dostuff 是否保证在函数返回后存在?

【问题讨论】:

  • C 没有构造函数。它们的语义不同于函数。
  • 是的,我知道。如果它困扰您,请在脑海中替换“C 构造函数样式的函数”。
  • 这是一个工厂函数。构造函数是绑定到现有(但未初始化)对象的方法。
  • @Olaf,请随意编辑。
  • 在 C 中做 OOP,这是“构造函数替换”最常用的形式。从技术上讲,它只是一个函数,既不是工厂函数(可能会为您提供不同的具体类型),也不是构造函数(分配后会自动调用)。从语义上讲,它是一个构造函数(作为实现细节)进行自己的分配。

标签: c pointers struct dynamic-memory-allocation lifetime


【解决方案1】:

是的,这不是未定义的行为。

在您的代码中,dostuff 持有由malloc() 返回的指针。它的生命周期一直持续到手动解除分配,例如使用free()。所以,返回dostuff,以后再用就好了。

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-03-12
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    相关资源
    最近更新 更多