Zer*_*30o 1 c++ malloc constructor destructor initialization
我一直试图在不需要时不初始化内存,并且正在使用malloc数组来这样做:
这是我运行的:
#include <iostream>
struct test
{
int num = 3;
test() { std::cout << "Init\n"; }
~test() { std::cout << "Destroyed: " << num << "\n"; }
};
int main()
{
test* array = (test*)malloc(3 * sizeof(test));
for (int i = 0; i < 3; i += 1)
{
std::cout << array[i].num << "\n";
array[i].num = i;
//new(array + i) i; placement new is not being used
std::cout << array[i].num << "\n";
}
for (int i = 0; i < 3; i += 1)
{
(array + i)->~test();
}
free(array);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
哪个输出:
0 ->- 0
0 ->- 1
0 ->- 2
Destroyed: 0
Destroyed: 1
Destroyed: 2
Run Code Online (Sandbox Code Playgroud)
尽管尚未构造数组索引。这是“健康”的吗?也就是说,我可以简单地将析构函数视为“只是一个函数”吗?(除析构函数对数据成员相对于我指定的指针位于何处具有隐式了解之外)
只是说明一下:我不是在寻找有关正确使用c ++的警告。我只想知道在使用此无构造方法时是否应该警惕。
(脚注:我不想使用构造函数的原因是因为很多时候,内存根本不需要初始化,而且这样做很慢)
不,这是不确定的行为。对象的生存期在完成对构造函数的调用之后开始,因此,如果从不调用构造函数,则从技术上讲该对象将不存在。
在您的示例中,这种“似乎”行为正确,因为您的结构很琐碎(int ::〜int是无操作的)。
您还会泄漏内存(析构函数会破坏给定的对象,但是通过分配的原始内存malloc仍需要freed)。
编辑:您可能也想看一下这个问题,因为这是非常相似的情况,只需使用堆栈分配代替即可malloc。这给出了一些有关对象寿命和构造的标准实际报价。
我还将添加它:如果您不使用new放置并且显然是必需的(例如struct包含一些容器类或vtable等),您将遇到真正的麻烦。在这种情况下,几乎可以肯定的是,对于非常脆弱的代码,省略新的放置调用将使您获得0的性能收益-无论哪种方式,这都不是一个好主意。