0

有什么区别

std::string a;

 std::string* a = new std::string();

如果两个对象都是由于方法调用而创建的?这两个物体对外界都是“可见的”吗?它们什么时候会被摧毁,或者永远不会?

谢谢。

4

6 回答 6

6

我假设您在函数范围内定义这些。

储存期限

std::string a;

这定义了一个名为atype的变量std::string。它创建一个std::string具有自动存储持续时间的类型的对象,这意味着当变量超出范围时它将被销毁。

std::string* a = new std::string();

这定义了一个名为atype的变量std::string*(指向 的指针std::string)。它创建一个std::string*具有自动存储持续时间的类型的对象,这意味着当变量超出范围时它将被销毁。也就是说,指针将在作用域结束时被销毁。

这个指针是用new-expression new std::string()初始化的。这个表达式动态分配一个std::string对象并返回一个指向它的指针。此对象具有动态存储期限,必须使用 手动删除delete a;。这会破坏a指向的对象。

能见度

可见性是名称的属性,而不是对象的属性。在这两种情况下,声明的名称a都是可见的,而它在范围内而不是隐藏。

于 2013-04-30T14:16:37.243 回答
4

可见性是一样的,生命周期是不一样的。

string一旦a超出范围,第一个将被删除。

在您手动调用之前,第二个string不会被删除delete a;

于 2013-04-30T14:15:59.250 回答
1

假设它们都是在方法(函数)中创建的。

  • 一旦函数返回,第一个就被销毁。
  • 只要你不召唤第二个delete,它就会活着。

string* flunk() {
    std::string str;
    std::string* str_p = new std::string; // This lives on

    return str_p;
    // str->~();  destructed here. 
}
于 2013-04-30T14:16:01.393 回答
1

两者具有相同的可见性,这取决于它们的声明位置。

第一个字符串在变量范围的末尾自动处理。除非delete使用存储在变量中的地址调用第二个,否则不会删除第二个。

于 2013-04-30T14:16:18.400 回答
1
std::string a; 

将在当前范围的末尾被销毁(通常是结束 } )。

std::string* a = new std::string();

当您对其调用 delete 时,将被销毁(删除)。

delete a;

至于可见性,它取决于它在您的代码中的位置;同样,它将在当前范围内可见(由大括号分隔),或者如果是类访问权限(公共、受保护或私有)的类的一部分。

于 2013-04-30T14:18:12.393 回答
1

不同之处在于,在第一种情况下:

std::string a;

在堆栈上创建一个std::string对象。当对象超出范围时,它会自动销毁。

在第二种情况下:

std::string* a = new std::string();

a指向std::string堆上对象的指针,当您显式调用delete a.

关于可见性,两者在当前范围内都是可见的。

于 2013-04-30T14:18:35.660 回答