使用malloc初始化一个类
Initializing a class using malloc
我正在使用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进行初始化。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 如果没有malloc,链表实现将失败
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- malloc调用在一个看似很小的请求后失败
- Malloc导致程序崩溃,在哪里寻找下一个线索
- 做 malloc 和 new 返回一个 int 对齐的地址
- 使用一个类的两个单独实例时出现Malloc错误2372
- malloc()是否可以分配一个与使用mmap()分配的另一个缓冲区重叠的缓冲区
- 在调用malloc之后,我得到了一个意外的大小
- 使用malloc和一个void指针复制一个临时结构
- 为什么在这里返回一个 malloc'd 指针会导致免费"HEAP CORRUPTION"?
- Calloc (), malloc() vs新建一个内部有unordered_map的结构体
- 在cuda __device__函数中分配(malloc)一个双**
- 使用malloc初始化一个类