LINUX.ORG.RU

[c++] как узнать удален ли указатель не используя умных указателей

 


0

1

Сабж. Например есть вектор указателей. В процессе работы некоторые указатели удаляются delete, по определенной процедуре мне нужно перебрать в векторе все указатели и удалить не удаленные, как это сделать?

Храни либо пары (указатель, булева переменная), либо отдельный вектор с булевыми переменными. О Боги! Какие же костыли... ты что-то делаешь не так, если задаешь такой вопрос.

anonymous
()

В общем случае у тебя получится weak_ptr :)

const86 ★★★★★
()

> В процессе работы некоторые указатели удаляются delete

кто/где вызывает этот delete? вот тот, кто это делает, пусть записывает в указатели NULLы.

arsi ★★★★★
()

Проще всего удалять одновременно с указываемым объектом и сам указатель из вектора.
weak_ptr, например, выше писали.

Хотя, ЕМНИП, при попытке разыменовать мертвый указатель, возникает какое-то стандартное исключение. Можешь попытаться отлавливать его и в случае поимки - удалять этот указатель из вектора.

schizoid ★★★
()

Помечай удаленные. Или тупо при удалении сразу обнуляй указатель.

А вообще, если тебе это нужно - явно делаешь что-то не так.

Deleted
()
Ответ на: комментарий от schizoid

> Хотя, ЕМНИП, при попытке разыменовать мертвый указатель, возникает какое-то стандартное исключение.

Нет, это чистой воды неопределённое поведение. Если повезёт и «мёртвый» указатель будет указывать в недоступную память, то будет сегфолт, но не исключение. Сегфолт поймать можно, но это кошмарнейший костылище.

const86 ★★★★★
()
Ответ на: комментарий от const86

> Сегфолт поймать можно, но это кошмарнейший костылище.

Это не костылище. Это прямой путь разбежаться и убиться об стену.

ТСу явно надо перебороть себя и переделать архитектуру.

DELIRIUM ☆☆☆☆☆
()

Ты что-то делаешь как минимум не красиво. Подумай.

erfea ★★★★★
()

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

KblCb ★★★★★
()

После delete указатель нужно обнулить.

UVV ★★★★★
()

Ъ программисты полжизни тратят на то чтобы правильно обнулять указатели. привыкай

VladimirMalyk ★★★★★
()
// What we're dealing with here is a total lack of respect for the law. © The Prodigy

std::vector < Fuck* > FuckPool;

// В процессе работы некоторые указатели удаляются delete
// замени своё delete FuckPool[42]; на

Fuck* item = FuckPool[42];
FuckPool.erase(FuckPool.begin()+42);
delete item;
nikitos ★★★
()

Кажется обнулить тут сейчас насоветуют, но это сложно и геморно, поэтому просто перепиши на коммон лиспе.

tensai_cirno ★★★★★
()
Ответ на: комментарий от Kosyak

Да, действительно. Это у меня в мозгу шаблон многовековой давности :)

Deleted
()

занулить указатель после удаления - самый простой вариант

najar
()

Мне всегда казалось, что

delete ptr; ptr = NULL;

является стандартной связкой.

AIv ★★★★★
()
Ответ на: комментарий от arsi

например

MyClass* cl = new MyClass();
myvec.push_back(cl);
delete cl;
//указатель в векторе ссылается на удаленный участок даже если я cl=null ни че не получится проверить, потомучто myvec[0] != null

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от AIv

это ptr будет NULL, а вот myvector[100500] не будет NULL; это мне еще его искать надо и обнулять.. не ужели в таком могучем языке как c++ нет какой нибудь стандартной функции, которая смотрит параша ли в том участке памяти к которому я лезу или нет.

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

Есть, называется умне указатели. Даже в стандарт, вроде бы, уже входит.

note173 ★★★★★
()
Ответ на: комментарий от pozitiffcat

> это ptr будет NULL, а вот myvector[100500] не будет NULL
void **ptr?
или ptr.resize(0)?

backbone ★★★★★
()

Решение самое очевидное:
При удалении указателя, всегда его NULL"и....

Jetty ★★★★★
()
Ответ на: комментарий от pozitiffcat

так по адресу myvectror[100500] будет что то лежать.

delete myvector[100500]; myvector[100500] = NULL;

Какие проблемы? ВСЕГДА ПОСЛЕ ОСВОБОЖДЕНИЯ ПАМЯТИ ПОЙНТЕР НУЛИТСЯ.

не ужели в таком могучем языке как c++ нет какой нибудь стандартной функции, которая смотрит параша ли в том участке памяти к которому я лезу или нет.

Если на один и тот же участок памяти ссылается неск указателей, память по одному из них освобождается (и указатель нулится), а остальные остаются как есть... ИМЕННО для этаких вещей придуманы смарт пойнтеры.

AIv ★★★★★
()
Ответ на: комментарий от pozitiffcat

Плохого кода наделать можно и покруче. Но зачем ?

Jetty ★★★★★
()

изобрел костыль

#include "stdafx.h"
#include <vector>
#include <stdio.h>
#include <iostream>
#include <map>
using namespace std;

map<void*,bool> ptrValid;
void deletePtr(void* ptr)
{
	ptrValid[ptr]=false;
	delete ptr;
}

class C
{
public :
	C();
	void foo();
};

C::C()
{
	ptrValid[this]=true;
}

void C::foo()
{
	cout<<"foo"<<endl;
	int i;
	cin>>i;
}

int main(int argc, char* argv[])
{	
	vector<C*> vec;
	C* cl = new C();
	vec.push_back(cl);
	vec.push_back(cl);
	cl->foo();
	deletePtr(cl);
	if(ptrValid[cl])//уже не валидный, этот код выполняться не будет
	{
		vec[0]->foo();
		vec[1]->foo();
	}
	return 0;
}

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

> изобрел костыль

убери отсюда эту гадость, а то новички насмотрятся и разбирай потом тонны говнокода за школотой!

dt1 ★★
()
Ответ на: комментарий от dt1

да вроде все предельно просто.. я из принципа не юзаю auto_ptr и т.д. ненравится мне гемор с шаблонами, кому как, для когото и мой костыль гемор =)

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

Во-первых в своем примере ты используешь шаблон map. Во-вторых у тебя будут серьезные проблеммы с производительностью. А в-третьих за «я из принципа не юзаю auto_ptr и т.д.» надо гнать сцаными тряпками из программирования.

Reset ★★★★★
()

как узнать удален ли указатель

разыменовать. у тебя есть только одна попытка.

mi_estas
()
Ответ на: комментарий от mi_estas

>чёйта за принцип такой? ты шапочку из фольги случайно не носишь?
чтоб потом по пол часа свой же говнокод не разбирать

pozitiffcat ★★★
() автор топика
Ответ на: комментарий от pozitiffcat

а сейчас ты чем занимаешься? не последовательно.

mi_estas
()
Ответ на: комментарий от pozitiffcat

> map<void*,bool> ptrValid;

тогда уж unordered_set<void*> validPointers;

aho
()
Ответ на: комментарий от pozitiffcat

> изобрел костыль

> #include «stdafx.h»

а на винфаке, наверное, тебя даже похвалили бы за такой код…

arsi ★★★★★
()
Ответ на: комментарий от pozitiffcat

Прости, но ты идиот или да? По какому принципу ты одни шаблоны не используешь (smart pointers), а другие используешь(containers)?

frozenix ★★★
()
Ответ на: комментарий от pozitiffcat

> я из принципа не юзаю auto_ptr и т.д. ненравится мне гемор с шаблонами

Омг.

pevzi ★★★★★
()

Как вариант - использовать итераторы. Затем удалять/обNULLять по человечески. list/deque вместо вектора(если удалять из массива). Ну и конечно умные указатели. Кроме auto_ptr есть много бустовских/С++0х'овых.

son_of_a_gun
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.