c ++指针范围

Kev*_*vin 19 c++ pointers scope

当您拥有以下代码时会发生什么:

void makeItHappen()
{
    char* text = "Hello, world";
}
Run Code Online (Sandbox Code Playgroud)

是否text超出范围并自动删除或保留在内存中?

以下示例如何:

class SomeClass
{
    public:
      SomeClass();
      ~SomeClass();
};

SomeClass::SomeClass() { }
SomeClass::~SomeClass()
{
    std::cout << "Destroyed?" << std::endl;
}

int main()
{
    SomeClass* someClass = new SomeClass();
    return 0;
} // What happend to someClass?
Run Code Online (Sandbox Code Playgroud)

这里有同样的事吗?

谢谢!

Kos*_*Kos 24

 char* text = "Hello, world";
Run Code Online (Sandbox Code Playgroud)

这里自动变量(指针)在堆栈上创建并设置为指向常量内存中的值,这意味着:

  • 字符串文字""通过整个程序执行存在.
  • 您不负责"分配"或"释放"它
  • 你可能不会改变它.如果你想改变它,那么你必须分配一些"非常量内存"并将其复制到那里.

当指针超出范围时,内存指针本身(4个字节)被释放,字符串仍然在同一个地方 - 常量内存.

对于后者:

SomeClass* someClass = new SomeClass();
Run Code Online (Sandbox Code Playgroud)

然后someClass指针在超出范围时也会被释放(因为指针本身也在堆栈上,就在第一个例子中)...... 但不是对象!

关键字new基本上意味着您为免费存储上的对象分配一些内存- 并且您负责delete有时调用以释放该内存.

  • 不同之处在于数字2不需要在内存中有一个地址,而字符串也是如此(因为指针指向它).*(这个数字2存在于你的内存的代码部分,你不需要直接访问,因为它是代码,而不是数据.)* (2认同)
  • @Kevin,你的程序的整个代码(编译的二进制代码)在程序执行期间保留在内存中,而常量字符串文字在这里遵循相同的规则. (2认同)

Pra*_*rav 11

是否text超出范围

是! 它是函数的本地函数makeItHappen(),当函数返回时,它超出了范围.但是,指向字符串文字"Hello, world";具有静态存储持续时间,并存储在内存的只读部分中.

以下示例如何:

......
这里有同样的事吗?

您的第二个代码示例泄漏内存.

SomeClass* someClass = new SomeClass();

someClass是本地的,main()所以当main返回时,自动变量被破坏.但是,指向的对象仍然存在于内存中,并且在函数返回后无法释放它.您需要显式写入delete someClass以正确释放内存.


vil*_*pam 6

变量文本超出范围(但不删除字符串文字).

对于使用new分配的对象(如SomeClass),您需要明确删除它们.如果你想要自动删除像这样分配的对象,请看一下boost智能指针(std :: unique_ptr,如果你的编译器是c ++ 0x).

当共享指针超出范围时,这将自动删除已分配的对象.

您的代码将如下所示:

int main(int argv, char **argv)
{
  boost::scoped_ptr<SomeClass> ptr(new SomeClass);
  // the object is automatically deleted
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:在此特定示例中,您还可以使用std :: auto_ptr(但这将在c ++ 0x中弃用).

注2:正如Kos的评论中指出的那样,在这种情况下使用boost :: scoped_ptr或std :: unique_ptr(c ++ 0x)更合适.我的回答首先使用了boost :: shared_ptr,如果你需要在几个类之间共享一个指针的所有权,这更合适.