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
有时调用以释放该内存.
Pra*_*rav 11
是否
text
超出范围
是! 它是函数的本地函数makeItHappen()
,当函数返回时,它超出了范围.但是,指向字符串文字"Hello, world";
具有静态存储持续时间,并存储在内存的只读部分中.
以下示例如何:
......
这里有同样的事吗?
您的第二个代码示例泄漏内存.
SomeClass* someClass = new SomeClass();
someClass
是本地的,main()
所以当main返回时,自动变量被破坏.但是,指向的对象仍然存在于内存中,并且在函数返回后无法释放它.您需要显式写入delete someClass
以正确释放内存.
变量文本超出范围(但不删除字符串文字).
对于使用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,如果你需要在几个类之间共享一个指针的所有权,这更合适.