在混合的c和c ++代码中使用new运算符

时间:2019-06-12 09:32:41

标签: c++ c malloc language-lawyer new-operator

考虑一个包含C和C ++混合代码的程序。 C ++部分包含一个类,该类动态分配C样式的typedef struct。最小示例:

obj.h (C代码)

typedef struct _Ctype {
  int i;
} Ctype;

class.hpp (C ++代码)

struct A {
  struct _Ctype *x;
  A(int i);
  ~A();
};

class.cpp (C ++代码)

#include "class.hpp"

extern "C" {
#include "obj.h"
}


A::A(int i)
{
  x = new struct _Ctype;
  x->i = i;
}

A::~A()
{
  delete(x);
}

main.cpp (C ++代码,主程序)

#include "class.hpp"

int main()
{
  A a(3);
  return 0;
}

(此设计的原理源自this answer

像上面的代码一样,使用new表达式分配C样式类型struct _Ctype是否安全(即没有UB),还是最好使用C样式{ {1}} / malloc

class.cpp (C ++代码,替代方法)

free

添加

为了在下面的一些评论之后澄清这个问题:在上面的最小示例中,所有代码都使用C ++编译器进行编译。但是,可以想到将C ++代码与C库一起使用。然后可以将问题重新表述如下:

  • 如果我通过C ++代码为C样式#include <cstdlib> #include "class.hpp" extern "C" { #include "obj.h" } A::A(int i) { x = (struct _Ctype *)malloc(sizeof(struct _Ctype)); x->i = i; } A::~A() { free(x); } 分配内存,那么C库可以安全地使用分配的变量吗?如果是这样,以上给出的替代方案是否安全?

请注意,还可以考虑通过C函数为typedef struct分配内存,以便C ++代码仅管理指向它的指针,例如:

obj.h (C代码)

Ctype

obj.C (C代码)

typedef struct _Ctype {
  int i;
} Ctype;

Ctype *allocate_Ctype();
void deallocate_Ctype(Ctype* p);

class.cpp (C ++代码)

#include <stdlib.h>
#include "obj.h"

Ctype *allocate_Ctype()
{
   return (Ctype *)malloc(sizeof(Ctype));
}

void deallocate_Ctype(Ctype *p)
{
   free(p);
}

(注意:当然,必须正确定义类A的复制构造函数和运算符分配,该代码用作问题的说明)

1 个答案:

答案 0 :(得分:4)

只要仅在您的控制下并使用delete表达式进行释放,就完全没有问题。与该结构交互的C代码不在乎如何分配它。

旁注:名称_Ctype在C ++中不合法,因为它以下划线开头,后跟一个大写字母。此类名称(以及包含双下划线的名称)保留给编译器和标准库使用。