有什么区别
std::string a;
和
std::string* a = new std::string();
如果两个对象都是由方法调用创建的? 两个物体都是“可见的”到外面,什么时候它们会被摧毁还是它们会被摧毁?
感谢。
答案 0 :(得分:6)
我假设您在功能范围内定义了这些。
std::string a;
这定义了一个名为a
的变量,其类型为std::string
。它创建了一个具有自动存储持续时间的std::string
类型的对象,这意味着当变量超出范围时它将被销毁。
std::string* a = new std::string();
这定义了一个名为a
的变量,其类型为std::string*
(指向std::string
的指针)。它创建了一个具有自动存储持续时间的std::string*
类型的对象,这意味着当变量超出范围时它将被销毁。也就是说,指针将在范围的末尾被销毁。
使用 new-expression new std::string()
初始化此指针。此表达式动态分配std::string
对象并返回指向它的指针。此对象具有动态存储持续时间,必须使用delete a;
手动删除。这会破坏a
指向的对象。
可见性是名称的属性,而不是对象的属性。在这两种情况下,声明的名称a
在范围内时都可见,而不是隐藏。
答案 1 :(得分:4)
可见性是相同的,生命周期不是。
string
超出范围时,第一个a
将被删除。
在您手动拨打string
之前,第二个delete a;
将被删除
答案 2 :(得分:1)
假设它们都是在方法(函数)中创建的。
delete
,第二个就会活着。string* flunk() {
std::string str;
std::string* str_p = new std::string; // This lives on
return str_p;
// str->~(); destructed here.
}
答案 3 :(得分:1)
两者具有相同的可见性,这取决于它们的声明位置。
第一个字符串在变量范围的末尾自动处理。第二个不会被删除,除非并且直到使用存储在变量中的地址调用delete
。
答案 4 :(得分:1)
std::string a;
将在当前范围结束时销毁(通常是关闭})。
std::string* a = new std::string();
当你在上面调用删除时,将被销毁(删除)。
delete a;
至于可见性,它取决于代码中的位置;再次,它将在当前范围(由大括号分隔)中显示,或者由类访问(公共,受保护或私有)的类的一部分可见。
答案 5 :(得分:1)
区别在于第一种情况:
std::string a;
在堆栈上创建std::string
对象。当对象超出范围时,它会自动销毁。
在第二种情况下:
std::string* a = new std::string();
a
是堆上std::string
对象的指针,当您明确调用delete a
时会被销毁。
关于可见性,两者都在当前范围内可见。