【问题标题】:Calling custom free C routine from C++ destructor?从 C++ 析构函数调用自定义的免费 C 例程?
【发布时间】:2012-02-13 11:38:36
【问题描述】:

我有一个名为myArchive 的C++ 程序,它调用静态C 库中的例程。

我的myArchive 代码有一个名为Archive 的类,其中包含一个名为md 的私有变量,它的类型为Metadata *,在我的C 库中定义。

这是myArchive.hpp 标头:

#ifndef MYARCHIVE_H
#define MYARCHIVE_H

#include "myLibraryHeaders.h"
...
namespace Archive {
    class Archive {
        public:
            Archive();
            virtual ~Archive();

            Metadata * getMd() { return md; }
            Metadata ** getMdRef() { return &md; }
            void setMd(Metadata *_md) { md = _md; }
        private:
            Metadata *md;
    };

    Archive::Archive() {
        md = NULL;
    }

    Archive::~Archive() {
        if (md != NULL) 
           freeMetadata(&md);
    }
}

#endif

freeMetadata() 函数只是释放链表中的项目:

void freeMetadata(Metadata **md) {                                                                                                                                                                                                         
    Metadata *iter;
    Metadata *prev = NULL;

    if (! *md)
        return;

    for (iter = *md; iter != NULL; iter = iter->next) {
        /* ... */
        if (prev != NULL)
            free(prev);
        prev = iter;
    } 

    if (prev != NULL) {
        free(prev);
        prev = NULL;
    }
}

这是myLibraryHeaders.h 中引用的标题之一中的声明:

#ifdef __cplusplus
extern "C" {
#endif

#ifndef METADATAHELPERS_H
#define METADATAHELPERS_H

typedef struct metadata {
    /* ... */
    struct metadata *next;
} Metadata;

/* ... */
void freeMetadata(Metadata **md);
/* ... */

#endif

#ifdef __cplusplus
}
#endif

我还有一些其他变量,但这是与我的问题相关的内容,即:

当我尝试编译它时,我得到一个超出范围的错误:

...
g++ -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -DUSE_ZLIB -DUSE_BZLIB -O3 -Wformat -Wall -Wswitch-enum -static -c myArchive.cpp -o myArchive.o
myArchive.hpp: In destructor "virtual myArchive::Archive::~Archive()":
myArchive.hpp:87: error: "freeMetadata" was not declared in this scope                                                                                                                                                  
make: *** [myArchive] Error 1

但我包含一个声明freeMetadata() 的头文件(在myLibraryHeaders.h 中)。此外,编译器并没有抱怨Metadata 类型,它本身也在myLibraryHeaders.h 的一个标头中定义。

我错过了什么或做错了什么?

【问题讨论】:

  • 请注意,您仅在 md 为空时调用该函数。标题是什么样的?
  • 修正了那个错字。我正在重写我的代码以适应 SO 问题字段,但我错过了。谢谢你的收获。
  • 你能贴出标头中有关freeMetadata函数原型的部分吗?这至少可以排除拼写错误等
  • 您的myArchive.hpp 在类定义后缺少;。这不应该编译(但与您描述的错误不同)。
  • 我想知道 freeMetadata 是否以某种方式被塞进了别人的命名空间 showhow?如果您注释调用并编译/链接,您可以执行“nm -a -C | grep freeMetada”(或者如果您不在 *nix 上,则可以使用 Windows 等效项)并查看它是如何定义的?

标签: c++ c memory free destructor


【解决方案1】:

唯一有意义的解释是,您以某种方式在 myLibraryHelpers.h 的包含之前定义了 METADATAHELPERS_H,这可能是由于某处的某些先前包含——某种循环包含依赖。您可以尝试使用g++ -E 来提取预处理后的文本并尝试查看是否可以解决问题(搜索 freeMetaData 出现在其中的位置以了解您最终的顺序),但总的来说解决这些问题可能很棘手

【讨论】:

  • 如果是这种情况,我认为它会抱怨任何使用元数据变量的行。我认为只需将 METADATAHELPERS_H 更改为其他内容就可以很容易地进行测试
猜你喜欢
  • 2018-07-01
  • 2015-05-07
  • 2011-07-15
  • 2018-02-06
  • 2011-01-11
  • 2014-05-03
  • 2021-05-18
  • 1970-01-01
  • 2021-07-19
相关资源
最近更新 更多