我应该总是在 C++ 中使用 new 运算符而不是 malloc 函数吗?[复制]

Should I always use the new operator in C++ instead of the malloc function? [duplicate]

提问人:Bhavik Sathvara 提问时间:8/24/2022 最后编辑:Mark RotteveelBhavik Sathvara 更新时间:8/25/2022 访问量:181

问:

这个问题在这里已经有答案了:
去年关闭。

这篇文章是去年编辑并提交审核的,但未能重新打开该帖子:

原始关闭原因未解决

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));

运行时内存分配应该怎么做?

C++ malloc 新运算符

评论

2赞 πάντα ῥεῖ 8/24/2022
必须在 c++ 中使用,否则代码具有未定义的行为。new
1赞 wohlstad 8/24/2022
malloc不调用构造函数,只分配内存。因此,您的对象是未初始化的,访问它是 UB。您应该避免在 c++ 中使用 ,甚至如上所述更好 - 如果可能的话,根本不使用动态分配。mallocnew
1赞 Daniel Langr 8/24/2022
通常,您可以使用代替 new 运算符;但是,不能使用代替新表达式mallocmalloc
1赞 Sam Varshavchik 8/24/2022
您能分享一下在 C++ 代码中使用的哪本 C++ 教科书吗?不,没有 C++ 教科书这样做。这种问题只是由于试图使用Google作为一个好的C++教科书的替代品而出现的。不幸的是,谷歌不是C++教科书的替代品。malloc
0赞 Drkawashima 9/5/2022
Curios - 这是否总是抛出运行时错误?从理论上讲,我认为它应该如此,但我让它在在线编译器中运行(如果我添加并在顶部)没有错误,并且它确实输出了“打印”。(具体 onlinegdb.com/online_c++_compiler#include <iostream>using namespace std;)

答:

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::stringstd::stringstd::stringnewA

如果仍需要动态分配对象,则不应使用原始拥有指针。您的代码泄漏了内存,并且没有简单的修复程序(当抛出异常时,可能永远不会达到末尾的 a)。当您确实需要动态分配对象时,请使用智能指针。deletemain

评论

0赞 Ben 8/24/2022
Malloc 并不是完全错误的,但你必须构造你的对象(在 C++20 中有一些例外),并且你必须破坏对象(不是严格意义上的,而是 yikes)和 ed 内存。所以只需使用 和 .或者更好:使用 .freemallocnewdeletestd::make_unique