使用malloc初始化一个类

Initializing a class using malloc

本文关键字:一个 malloc 初始化 使用      更新时间:2023-10-16

我正在使用c++作为中间语言为avr开发一种玩具语言,问题是avr-gcc没有新的实现。我所有的对象都是从object类派生出来的它有虚拟方法当我用malloc创建一个float对象时使用来自

的指令我可以在c++中实现工厂方法模式而不使用new吗?

一旦我将它转换为一个对象来传递并返回到Float我的程序崩溃,答案中的评论说,这是由于虚表没有正确初始化,所以我怎么能创建一个c++对象而不使用新的和有虚表设置正确?

看起来new作为一种语言结构是被支持的,但是作为它的基础和实际分配的operator new代码并没有实现。

通过在源代码中提供您自己的operator new实现,应该很容易解决这个问题:

在一些头文件中包含在任何需要new的文件

#include <stdlib.h> 
void * operator new(size_t size); 
void operator delete(void * ptr);

在单个cpp文件中

void * operator new(size_t size) 
{ 
  return malloc(size); 
} 
void operator delete(void * ptr) 
{ 
  free(ptr); 
} 

来源:这篇文章在avrfreaks.net,其中也包含了一些其他的东西,你可能想要/需要实现自己的信息。

这取决于您要编译的硬件平台,但不同实现的布局通常非常相似。毕竟,第一个c++是CFRONT,它将c++编译成C…

与平台相关的问题和内存布局将在"平台c++ ABI"中描述,其中ABI代表"应用程序二进制接口"。
struct Cxx_ABI_Header
{
    unsigned inheritance_backward_offset;  /* Must be Zero for base object */
    unsigned rtti; /* Each class has its own signature. */
    void * vtable; /* Pointer to array of virtual function pointers. */
}
struct object_one
{
     char * file_name;
     int file_descriptor;
}
int object_one_create_file(struct object_one *);
int object_one_delete_file(struct object_one *);
int object_one_update_file(struct object_one *, off_t offset, 
                           size_t nbytes_replace, size_t nbytes_supplied,
                           char * buf);
int object_one_read_file(struct object_one *, off_t offset, 
                         size_t nbytes_read, char * buf);
int object_one_op_noauthz(struct object_one *)
{
    return ENOACCESS;
}
void * CRUD_vtable_authenticated_user = {
    { object_one_create_file, object_one_read_file,
      object_one_update_file, object_one_delete_file }};
void * CRUD_vtable_guest = {
    { object_one_op_noauthz, object_one_read_file,
      object_one_op_noauthz, object_one_op_noauthz }};

这是一个可能的构造函数,它实际上创建了两种不同的"object_one"。

struct object_one * new_object_one(char * filespec, int user_id)
{
    size_t n_bytes = sizeof(struct Cxx_ABI_Header) + sizeof(struct object_one);
    void * pheap = malloc(n_bytes);
    struct * pCxx_ABI_Header pcxx = pheap;
    struct * pObject  pobj = (void *)((char *)pheap 
                                               + sizeof(struct Cxx_ABI_Header));
    if (!pheap) ...
    pcxx->inheritance_backward_offset = 0;
    pcxx->rtti = /* You tell me? */
    pcxx->vtable = (userid < 0 ) ? CRUD_vtable_guest 
                                 : CRUD_vtable_authenticated_user;
    pobj->file_name = strdup(filespec);
    pobj->file_descriptor = 0;
    return pobj;
}

通过?:实现多态性

无论如何,享受语言实验,祝你好运,改进c++。通过将你的努力建立在C上,你将有一个坚实的开端。div;)

您可以使用malloc,然后使用place -new,这将正确地创建对象,在您指定的位置构造它。

当然,这仍然意味着使用关键字"new",但如果你真正想做的是处理内存/堆管理,而不是完全禁止该关键字,那么它可能会实现你想要的。

如果您想为特定编译器的特定版本定制实现,那么可以,对于GCC,只需查看GCC代码中new的实现。

否则没有。你能做的是双因子初始化。首先分配内存(malloc()operator new()),然后使用位置new进行初始化。