提问人:Bhavik Sathvara 提问时间:8/24/2022 最后编辑:Mark RotteveelBhavik Sathvara 更新时间:8/25/2022 访问量:181
我应该总是在 C++ 中使用 new 运算符而不是 malloc 函数吗?[复制]
Should I always use the new operator in C++ instead of the malloc function? [duplicate]
问:
struct A
{
string st;
};
int main()
{
A *a = (A *)malloc(sizeof(A));
a->st = "print";
cout << a->st;
return 0;
}
当我使用这种方式并且编译成功时,但是在运行时出现异常之后。所以,我发现一件事是而不是.哪种方式更适合做这类事情,而且没有错误?A *a = new A;
A *a = (A *)malloc(sizeof(A));
运行时内存分配应该怎么做?
答:
5赞
463035818_is_not_an_ai
8/24/2022
#1
malloc
独自一人是完全错误的。 分配内存,它不创建对象。malloc
new
通过调用构造函数分配内存并创建对象。
“更好”的方法是在没有理由使用它们时不使用两者中的任何一个。
int main() {
A a;
a.st = "print";
cout << a.st;
}
A
只有一个 类型的成员。 已在管理动态分配的字符串。没有理由动态分配 ,也没有理由用于创建 .std::string
std::string
std::string
new
A
如果仍需要动态分配对象,则不应使用原始拥有指针。您的代码泄漏了内存,并且没有简单的修复程序(当抛出异常时,可能永远不会达到末尾的 a)。当您确实需要动态分配对象时,请使用智能指针。delete
main
评论
0赞
Ben
8/24/2022
Malloc 并不是完全错误的,但你必须构造你的对象(在 C++20 中有一些例外),并且你必须破坏对象(不是严格意义上的,而是 yikes)和 ed 内存。所以只需使用 和 .或者更好:使用 .free
malloc
new
delete
std::make_unique
评论
new
malloc
不调用构造函数,只分配内存。因此,您的对象是未初始化的,访问它是 UB。您应该避免在 c++ 中使用 ,甚至如上所述更好 - 如果可能的话,根本不使用动态分配。malloc
new
new
运算符;但是,不能使用代替新
表达式。malloc
malloc
malloc
#include <iostream>
using namespace std;
)