有什么区别
std::string a;
和
std::string* a = new std::string();
如果两个对象都是由于方法调用而创建的?这两个物体对外界都是“可见的”吗?它们什么时候会被摧毁,或者永远不会?
谢谢。
有什么区别
std::string a;
和
std::string* a = new std::string();
如果两个对象都是由于方法调用而创建的?这两个物体对外界都是“可见的”吗?它们什么时候会被摧毁,或者永远不会?
谢谢。
我假设您在函数范围内定义这些。
std::string a;
这定义了一个名为a
type的变量std::string
。它创建一个std::string
具有自动存储持续时间的类型的对象,这意味着当变量超出范围时它将被销毁。
std::string* a = new std::string();
这定义了一个名为a
type的变量std::string*
(指向 的指针std::string
)。它创建一个std::string*
具有自动存储持续时间的类型的对象,这意味着当变量超出范围时它将被销毁。也就是说,指针将在作用域结束时被销毁。
这个指针是用new-expression new std::string()
初始化的。这个表达式动态分配一个std::string
对象并返回一个指向它的指针。此对象具有动态存储期限,必须使用 手动删除delete a;
。这会破坏a
指向的对象。
可见性是名称的属性,而不是对象的属性。在这两种情况下,声明的名称a
都是可见的,而它在范围内而不是隐藏。
可见性是一样的,生命周期是不一样的。
string
一旦a
超出范围,第一个将被删除。
在您手动调用之前,第二个string
不会被删除delete a;
假设它们都是在方法(函数)中创建的。
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;
至于可见性,它取决于它在您的代码中的位置;同样,它将在当前范围内可见(由大括号分隔),或者如果是类访问权限(公共、受保护或私有)的类的一部分。
不同之处在于,在第一种情况下:
std::string a;
在堆栈上创建一个std::string
对象。当对象超出范围时,它会自动销毁。
在第二种情况下:
std::string* a = new std::string();
a
是指向std::string
堆上对象的指针,当您显式调用delete a
.
关于可见性,两者在当前范围内都是可见的。