Я распределяю структуру динамически в одном из моих классов в моем проекте Qt. Затем я передаю указатель на эту структуру на другую переменную в другом классе. И затем в некоторых ситуациях я удаляю первое выделение, поэтому у меня больше не будет структуры! Теперь вот вопрос:
I want my second pointer to find out if the slot it is pointing to is allocated or not, how can я do that?
Заранее благодарю вас, пожалуйста, сообщите мне, нужна ли вам какая-либо часть моего кода.
Либо a) Не делайте этого, то есть никогда не храните ссылки на динамически распределенные элементы, или b) Не пропускайте указатель, передавая индекс в таблицу распределения. Лучше всего не удалять его напрямую, а использовать подсчет ссылок и удалять только при отсутствии ссылок (сбор мусора), иначе вы установите значение null на удаление и должны проверять всюду перед использованием, чтобы это не было нулевым. Обратите внимание: если вам действительно нужно много чего делать, переключитесь на python, который делает это автоматически для вас все время. Для python существуют привязки QT.
Взгляните на эти ответы.
Если код Qt не может удалить ваш указатель, вы можете использовать std::shared_ptr
и std::weak_ptr
чтобы помочь вам отслеживать эти вещи.
#include <iostream>
#include <memory>
struct Foo { int a; };
int main()
{
std::shared_ptr<Foo> shared = std::make_shared<Foo>();
std::weak_ptr<Foo> weak = shared;
std::cout << "is valid?: " << (bool)shared << weak.expired() << std::endl;
shared.reset(); // delete the pointer
std::cout << "is valid?: " << (bool)shared << weak.expired() << std::endl;
return 0;
}
приводит к тому,
is valid?: 10
is valid?: 01
то есть после того, как shared_ptr выпустит свои выделенные данные, также истечет срок действия weak_ptr (expired возвращает true).
Qt имеет похожие классы, которые помогут вам. QSharedPointer, QWeakPointer и т.д. Если вам нужно отслеживать, если указатель QObject удален, вы должны использовать QPointer
http://qt-project.org/doc/qt-5/QPointer.html
Защищенный указатель QPointer ведет себя как обычный указатель C++ T *, за исключением того, что он автоматически устанавливается в 0, когда объект, на который ссылается объект, уничтожается (в отличие от обычных C++ указателей, которые в таких случаях становятся "оборванными указателями"). T должен быть подклассом QObject.
например,
#include <QCoreApplication>
#include <QDebug>
#include <QPointer>
int main(int a, char *b[])
{
QCoreApplication app(a,b);
QObject *obj1 = new QObject;
QObject *obj2 = new QObject(obj1);
QPointer<QObject> o(obj2);
qDebug() << o.isNull();
delete obj1;
qDebug() << o.isNull();
return 0;
}
приводит к тому,
false
true
Как вы можете видеть, указатель дочернего QObject недействителен.
Короткий ответ, вы не можете.
Долгий ответ, это зависит от того, какая библиотека распределения памяти или реализация библиотеки распределения или отладка замены используемой библиотеки распределения и какие функции отладки она поддерживает.