的区别是什么
std::string a;
和
std::string* a = new std::string();
如果两个对象都是作为方法调用的结果创建的?这两个物体对外界"可见"吗?它们什么时候会被摧毁,或者永远不会被摧毁?
谢谢。
我假设您在函数范围内定义这些。
存储持续时间
std::string a;
这定义了一个名为a
、类型为std::string
的变量。它创建了一个具有自动存储持续时间的std::string
类型的对象,这意味着当变量超出范围时,它将被销毁。
std::string* a = new std::string();
这定义了一个名为a
的变量,类型为std::string*
(指向std::string
的指针(。它创建了一个具有自动存储持续时间的std::string*
类型的对象,这意味着当变量超出范围时,它将被销毁。也就是说,指针将在作用域的末尾被销毁。
该指针使用新表达式new std::string()
初始化。此表达式动态分配std::string
对象并返回指向该对象的指针。此对象具有动态存储持续时间,必须使用delete a;
手动删除。这会破坏a
指向的对象。
可见性
可见性是名称的特性,而不是对象的特性。在这两种情况下,声明的名称a
在作用域中时是可见的,而不是隐藏的。
可见性相同,生存期不同。
一旦a
超出范围,第一个string
就会被删除。
在手动调用delete a;
之前,第二个string
不会被删除
假设它们都是在一个方法(函数(中创建的。
- 函数一返回,第一个就被销毁
- 只要你不在上面打
delete
,第二个就可以活下去
string* flunk() {
std::string str;
std::string* str_p = new std::string; // This lives on
return str_p;
// str->~(); destructed here.
}
两者具有相同的可见性,这取决于它们的声明位置。
第一个字符串将在变量作用域的末尾自动处理。除非使用存储在变量中的地址调用delete
,否则不会删除第二个。
std::string a;
将在当前作用域的末尾被销毁(通常是一个结束}(。
std::string* a = new std::string();
当你对它调用delete时,它将被销毁。
delete a;
至于可见性,它取决于它在代码中的位置;同样,它将在当前作用域中可见(用大括号分隔(,或者如果是类的一部分,则通过类访问(public、protected或private(可见。
区别在于,在第一种情况下:
std::string a;
在堆栈上创建一个std::string
对象。当对象超出范围时,它会自动销毁。
在第二种情况下:
std::string* a = new std::string();
a
是指向堆上std::string
对象的指针,当显式调用delete a
时,该对象将被销毁。
关于可见性,两者都在当前范围内可见。