我可以称呼班级显性的构造函数和攻击函数
Can I call the constructor and destructor of a class explicity?
以某种方式我需要在预先分配的内存中使用类对象。但是,G 不喜欢我的代码。这是说
invalid use of ‘CTest::CTest’ in line 26
如何更改它以使其工作?
#include <stdio.h>
#include <stdlib.h>
#include <string>
class CTest
{
public:
CTest(const char* str)
{
printf("constructorn");
m_str = str;
}
virtual ~CTest()
{
printf("destructorn");
}
void output()
{
printf("output:%sn", m_str.c_str());
}
protected:
std::string m_str;
};
struct TTT
{
char test_ptr[sizeof(CTest)];
};
int main(int argc, char* argv[])
{
struct TTT* ttt = (struct TTT*)malloc(sizeof(struct TTT));
CTest* test = (CTest*)(ttt->test_ptr);
test->CTest("123456");
test->output();
test->~CTest();
return 0;
}
您无法直接调用构造函数。取而代之的是,您必须为对象使用"放置新的"(用于"放置新&quot"的用途是什么?)。它基本上使用了您提供呼叫构造函数的内存。但是,您可以直接致电destuructor-简单呼叫〜ctest(),并且不要调用delete。
关于问题的标题,
&ldquo;我可以称呼类别的构造函数和驱动器?&rdquo;
是的,例如,每次创建班级临时性时,您都非常明确地调用构造函数(明确的销毁器调用更为罕见)。
标准很长一段时间以前的评论使这个问题混淆了,"看起来像是一个明确的构造函数呼叫;但很简单,明确的是明确的,并且隐含是隐式的,并且呼叫是呼叫,并且标准不重新定义。这些术语。关于这个术语;正如应用于构造函数的那样,标准是指源代码级别构造函数'在默认构造函数的定义中。无论如何,这是术语的问题。
但是真正的问题是不同的,
&ldquo;我需要在预先分配的内存中使用类对象;
为此,您可以使用只需返回通过它的地址的分配函数即可。标准库通过标题<new>
提供了这样的分配功能。选择"假人"分配函数您可以简单地将指针传递给缓冲区作为参数,以便由普通过载分辨率选择。
要通过指针参数,您可以使用放置新语法,如下:
#include <new>
// ...
CTest* p_test = ::new (&ttt) CTest( "12345" );
其中 ttt
是缓冲区。
请注意全局名称空间资格,通常需要它以不拾取所讨论的类别的分配函数。
为此,可以很好地工作;没有崩溃,没有修复延迟&ndash;您使用的地址必须适合对齐。例如,根据班级,它可能需要是4个或8的倍数。如果缓冲区来自默认的new
,则没问题,只需使用缓冲区的开始,但是我不确定malloc
,因为您似乎使用了。
请咨询有关的文档。
C 11对对齐有一些支持,但是您的编译器可能不一定会提供(尚未)。对于特定于平台的代码,您可能不需要解决此问题。但是,如果您想要便携式代码,则应确保正确对齐。
实际上一种做法的方法是使您的缓冲区16字节比严格必要的不带对齐要求大,并使用指针从缓冲区开始时适当抵消位置。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 您可以在不调用构造函数的情况下调用攻击器吗?
- 我可以称呼班级显性的构造函数和攻击函数