用malloc替换operator new

Nik*_*ika 0 c++ memory operator-overloading

我正在尝试用malloc和free替换operator new和delete(我有理由).问题显示在下面的代码中:

std::string *temp = (std::string *)malloc(sizeof(std::string) * 2); // allocate space for two string objects.
temp[0] = "hello!";
temp[1] = "world!";
for(int i = 0; i < 2; i++)
{
    printf("%s\n", temp[i].c_str());
}
free(temp);
return 0; // causes SIGSEGV.
Run Code Online (Sandbox Code Playgroud)

然而..

std::string *temp = new std::string[2];
temp[0] = "hello!";
temp[1] = "world!";
for(int i = 0; i < 2; i++)
{
    printf("%s\n", temp[i].c_str());
}
delete [] temp;
return 0; // works fine
Run Code Online (Sandbox Code Playgroud)

为什么?并且有人可以建议我用malloc和free替换这些运算符的正确方法是什么?

问候.

编辑:这只是一个例子,我没有使用标准的C++库.

编辑:这样的事情怎么样?

class myclass
{
    public:
        myclass()
        {
            this->number = 0;
        }
        myclass(const myclass &other)
        {
            this->number = other.get_number();
        }
        ~myclass()
        {
            this->number = 0;
        }
        int get_number() const
        {
            return this->number;
        }
        void set_number(int num)
        {
            this->number = num;
        }
    private:
        int number;
};

int main(int argc, char *argv[])
{
    myclass m1, m2;
    m1.set_number(5);
    m2.set_number(3);

    myclass *pmyclass = (myclass *)malloc(sizeof(myclass) * 2);

    pmyclass[0] = myclass(m1);
    pmyclass[1] = myclass(m2);

    for(int i = 0; i < 2; i++)
    {
        printf("%d\n", pmyclass[i].get_number());
        pmyclass[i].myclass::~myclass();
    }

    free(pmyclass);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Cap*_*ous 7

malloc并且free不要调用C++类的构造函数和析构函数.它也不存储有关在数组中分配的元素数量的信息(就像您正在做的那样).这意味着内存只是分配但从未初始化.但是,您仍然可以手动构造和销毁对象.

您应该首先使用placement-new构建对象.这要求您将指针传递给要创建对象的位置,并指定需要实例化的对象类型.例如,将字符串文字分配给已分配(但未初始化)的字符串对象的第一行将如下所示:

new(&temp[0]) std::string("hello!");
Run Code Online (Sandbox Code Playgroud)

一旦你完成了字符串,你需要通过直接调用它们的析构函数来销毁它们.

temp[0].std::string::~string();
Run Code Online (Sandbox Code Playgroud)

你提出的代码看起来像这样:

// allocate space for two string objects.
std::string *temp = (std::string *)malloc(sizeof(std::string) * 2); 

// Using placement-new to constructo the strings
new(&temp[0]) std::string("hello!");
new(&temp[1]) std::string("world!");

for (int i = 0; i < 2; i++)
{
    printf("%s\n", temp[i].c_str());
}

//  Destroy the strings by directly calling the destructor
temp[0].std::string::~string();
temp[1].std::string::~string();
free(temp);
Run Code Online (Sandbox Code Playgroud)