void doSomething()
{
TheObject *ptr = new TheObject;
delete ptr;
ptr = NULL;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
让我借用cplusplus.com中operator delete的字样:
释放由ptr指向的内存块(如果不为null),通过调用operator new释放先前分配给它的存储空间,并使该指针位置无效.
请帮助清除我的困惑:删除后指针本身会发生什么?指针本身确实有一个地址,对吗?所以在删除指向的块之后,指针本身呢?
在返回指针初始化的方法后,我可以说指针本身是自由的吗?指针本身是放在堆栈还是堆上?
我们只能取消引用有效的指针,并且只能检查悬空内置指针指向的地址。我们无法访问它的值(它指向的对象地址中的值)。
int* ptr = nullptr;
if(ptr) // != 0x00000000
std::cout << *ptr << '\n';
ptr = new int(1000);
if(ptr) // != 0x00000000
std::cout << *ptr << '\n';
delete ptr; // still pointing at the address of that dynamic object but that object has been destroyed.
if(ptr) // succeeds or undefined behavior?
std::cout << *ptr << '\n'; // of course UB here
Run Code Online (Sandbox Code Playgroud)
所以我很清楚,但我关心的只是检查指针值是否安全或产生 UB?if(ptr)。因为我们假设我没有像 那样访问该地址中的值std::cout << *ptr。
int*a=nullptr; //NULL before C++11
a=new int(1);
delete a;
Run Code Online (Sandbox Code Playgroud)
a现在指向什么?是否指向nullptr或指向它被删除之前指向的地址?
假设我们有来自C++ 98的遗留代码:
bool expensiveCheck();
struct Foo;
bool someFunc()
{
Foo *ptr = 0;
if( expensiveCheck() )
ptr = new Foo;
// doing something irrelevant here
...
if( ptr ) {
// using foo
}
delete ptr;
return ptr; // here we have UB(Undefined Behavior) in C++11
}
Run Code Online (Sandbox Code Playgroud)
所以基本上这里的指针用于保持动态分配的数据并同时将其用作标志.对我来说它是可读代码,我相信它是合法的C++ 98代码.现在根据这个问题:
这段代码在C++ 11中有UB.这是真的吗?
如果是,请记住另一个问题,我听说委员会付出了巨大努力,不破坏新标准中的现有代码.如果我在这种情况下没有弄错,这不是真的.是什么原因?这样的代码是否已经被认为是有害的,所以没有人关心它会被打破?他们没有考虑后果?这种优化是如此重要?别的什么?
假设我有自己的实现std::vector,它为迭代提供begin()和end()函数.可能会发生size()== capacity()和返回的指针end()不归我所有.它是安全的还是我需要确保size()< capacity()?
我知道这一难题可以通过使用自定义的迭代器类来克服,但在这里,我说的是,当简单的情况下,begin()简单地返回一个指向缓冲区的开始,并end()到begin()+size().
删除ptr后,是否cout << ptr打印 的地址int(6)?
如果是的话,为什么会出现乱码呢?我记得是delete只释放指定空间的数据吧?
还有我想问delete这里释放空间数据的时候,是只释放6还是连int类型都释放?
int* ptr = new int(6);
cout << "Address of the space pointed to by ptr: " << ptr << endl;
cout <<"the value of the space pointed to by ptr: "<< *ptr << endl;
delete ptr;
cout << ptr << endl;
Run Code Online (Sandbox Code Playgroud) 我最近开始学习 C++ 中的智能指针和移动语义。但我不明白为什么这段代码有效。我有这样的代码:
#include <iostream>
#include <memory>
using namespace std;
class Test
{
public:
Test()
{
cout << "Object created" << endl;
}
void testMethod()
{
cout << "Object existing" << endl;
}
~Test()
{
cout << "Object destroyed" << endl;
}
};
int main(int argc, char *argv[])
{
Test* testPtr = new Test{};
{
unique_ptr<Test> testSmartPtr(testPtr);
}
testPtr->testMethod();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的输出是:
Object created
Object destroyed
Object existing
Run Code Online (Sandbox Code Playgroud)
为什么行testPtr->testMethod()有效?如果指针是左值,unique_ptr 不会在销毁时删除分配给它的指针吗?
编辑:我从评论中了解到,此方法不会检查指针是否存在。如果是这样,有没有办法检查指针是否有效?
编辑:我了解到我不应该对无效指针做任何事情。感谢您的所有回答和评论。
编辑:即使这个代码也有效:
#include <iostream>
#include <memory> …Run Code Online (Sandbox Code Playgroud)