struct A
{
string st;
};
int main()
{
A *a = (A *)malloc(sizeof(A));
a->st = "print";
cout << a->st;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用这种方式并成功编译时,但之后在运行时出现异常。所以,我发现一件事是A *a = new A;代替A *a = (A *)malloc(sizeof(A));。做这种事情哪种方法更好而且不会出错?
运行时内存分配应该怎么做?
malloc独自一人是完全错误的。malloc分配内存,但不创建对象。
new通过调用构造函数分配内存并创建对象。
“更好”的方法是当没有理由使用两者中的任何一个时都不使用它们。
int main() {
A a;
a.st = "print";
cout << a.st;
}
Run Code Online (Sandbox Code Playgroud)
A只有一个类型为 的成员std::string。std::string已经在管理动态分配的字符串。没有理由动态分配 a std::string,也没有理由使用new它来创建A.
如果您仍然需要动态分配对象,则不应使用原始拥有指针。您的代码泄漏了内存,并且没有简单的修复方法(抛出异常时可能永远不会到达delete末尾的a )。main当您确实需要动态分配对象时,请使用智能指针。