std矢量包含指针和变量地址.清理
std vector holds pointers and variable addresses. clean up?
假设我有一个向量,它包含指向动态内存的指针,也包含堆栈上声明的变量的地址,有没有一种方法可以安全地循环并仅删除动态内存,或者我只能使用其中一个?还是做以下事情是安全的?我想,根据编译器的不同,结果可能是不可预测的。
std::vector<int*> theInts;
int* i = new int;
*i = 1;
theInts.push_back(i);
int j = 2;
theInts.push_back(&j);
std::vector<int*>::iterator iIt=theInts.begin();
for(;iIt<theInts.end();iIt++)
delete *iIt;
编辑:当我研究共享指针时,我暂时改变了使用原始指针的方式,同时有人能告诉我以下内容是否安全吗?这是我的程序现在正在做的的分解版本
vector<int*>theInts;
int* anInt = new int;
theInts.push_back(anInt);
if(NULL != anInt)
delete anInt;
anInt = NULL;
vector<int*>::iterator bIt = theInts.begin();
for(;bIt!=theInts.end();bIt++)
{
int* aInt = *bIt;
if(NULL!=aInt)
delete aInt;
aInt=NULL;
}
theInts.clear();
您只能删除new
结果或空指针的指针。&j
不是new
的结果,也不是空指针。
所以你的代码不安全。没有可移植的方法,只能从指针中找出它指向的是自动对象还是动态对象。
您可以单独维护一个指示它是哪个的标志,或者您可以使用shared_ptr
或unique_ptr
而不是原始指针,并且对于堆栈变量,将deleter设置为一个无所事事的函数。
如果编写混乱的代码,很可能会得到混乱的结果。你可以像你一样使用指向局部的指针,但除非你对你所做的事情进行明确的检查,否则你最终也会得到你的结果;delete(),这可能会有所帮助。
相关文章:
- 附加调试器并以编程方式获取变量地址 Visual Studio
- 变量地址的运算符[]是如何工作的
- C 给出了一个字符串列表,如何从类中获取各个变量地址
- 从函数返回变量地址时如何修复"与局部变量关联的堆栈内存地址"?
- 获取封装在命名空间中的静态变量地址
- 为什么分配的变量地址之间相差 16 个字节?
- 为什么在循环中定义的变量地址在每次迭代中都保持不变
- 是否可以使用指向语句中声明的变量地址的指针"if"
- 字符串从变量(&变量)地址的长度 - 嵌入式C
- 汇编:C++堆栈变量地址不同/错误?
- x 在变量地址中的意义是什么?
- 在哪里放置 HW BP 以捕获全局变量地址损坏
- C++变量地址不匹配
- 重载 std::ostream 运算符<<未调用,stream 获取变量地址而不是对象
- std矢量包含指针和变量地址.清理
- 注册变量地址
- 使用内联程序集获取变量地址
- 如果用调试信息编译,则通过其名称获取全局变量地址
- 如何在Visual Studio中复制变量地址
- 当堆栈内存中的变量地址分配给数据段或堆内存中的指针时,是否有任何错误?