вектор std содержит указатели и переменные адреса.убирать? - PullRequest
0 голосов
/ 15 марта 2012

Скажем, у меня есть вектор, который содержит указатели, указывающие на динамическую память, а также адреса переменных, объявленных в стеке, есть ли способ безопасно перебрать и удалить только динамическую память, или я вынужден просто использовать одну или другую?или делает следующее безопасно?Я подумал, что, возможно, результат будет непредсказуемым в зависимости от компилятора.

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;

edit: я временно изменил вещи, чтобы использовать необработанные указатели, пока я смотрю на общие указатели, в то же время кто-то может сказать мне, еслиследующее безопасно?это сломанная версия того, что сейчас делает моя программа

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();

Ответы [ 2 ]

3 голосов
/ 15 марта 2012

Вы можете удалить только указатель, который является либо результатом new, либо нулевым указателем. &j не является результатом new и не является нулевым указателем.

Так что ваш код не является безопасным. Нет никакого портативного способа узнать, только от указателя, указывает ли он на автоматический или динамический объект.

Вы могли бы отдельно поддерживать флаг, указывающий, какой это, или вы могли бы использовать shared_ptr или unique_ptr вместо необработанных указателей, а для переменных стека установить для средства удаления функцию бездействия.

1 голос
/ 15 марта 2012

Если вы напишите грязный код, вы получите грязные результаты.Вы можете ~ использовать ~ указатели на местных жителей так же, как и вы, но в итоге вы также получите свой результат, если не будете четко проверять, что вы делаете.Вот интересная статья о new () & delete () , которая может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...