我可以称呼班级显性的构造函数和攻击函数

Can I call the constructor and destructor of a class explicity?

本文关键字:构造函数 攻击 函数 我可以      更新时间:2023-10-16

以某种方式我需要在预先分配的内存中使用类对象。但是,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字节比严格必要的不带对齐要求大,并使用指针从缓冲区开始时适当抵消位置。