Как узнать, выделен ли слот памяти?

0

Я распределяю структуру динамически в одном из моих классов в моем проекте Qt. Затем я передаю указатель на эту структуру на другую переменную в другом классе. И затем в некоторых ситуациях я удаляю первое выделение, поэтому у меня больше не будет структуры! Теперь вот вопрос:

I want my second pointer to find out if the slot it is pointing to is allocated or not, how can я do that?

Заранее благодарю вас, пожалуйста, сообщите мне, нужна ли вам какая-либо часть моего кода.

Теги:
pointers

3 ответа

0
Лучший ответ

Либо a) Не делайте этого, то есть никогда не храните ссылки на динамически распределенные элементы, или b) Не пропускайте указатель, передавая индекс в таблицу распределения. Лучше всего не удалять его напрямую, а использовать подсчет ссылок и удалять только при отсутствии ссылок (сбор мусора), иначе вы установите значение null на удаление и должны проверять всюду перед использованием, чтобы это не было нулевым. Обратите внимание: если вам действительно нужно много чего делать, переключитесь на python, который делает это автоматически для вас все время. Для python существуют привязки QT.

Взгляните на эти ответы.

  • 0
    Это может быть для объектов QT, но тогда вам нужно будет использовать только новые библиотеки и механизмы удаления.
0

Если код 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 недействителен.

0

Короткий ответ, вы не можете.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню