Russian Qt Forum
Ноябрь 22, 2024, 22:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSharedMemory указатели  (Прочитано 2472 раз)
ammaximus
Гость
« : Июль 06, 2015, 10:29 »

Работаю с QSharedMemory. Если создавать ее экземпляры в разных проектах, то указатель на данные один и тот же. Но если в одном проекте создать несколько копий, то указатели разные, хотя все работает! В чем дело?

Код:
#include <QApplication>
#include <QWidget>
#include <QSharedMemory>
#include <iostream>
class A{
    public:
    A() :mem("testmem")
    {
        if (!mem.create(sizeof(int))){
        std::cout << "FTimeAttach: " << mem.attach() << std::endl;
        }
else{
    std::cout << "FTimeCreate!, SET ONLY HERE" << std::endl;
    set(7);
        }
    }
   
    QSharedMemory mem;
   
    void  set(int i){
*(int*)mem.data() = i;
    }
    void print(){
std::cout << mem.data() << std::endl;
std::cout << *(int*)mem.data() << std::endl;
    }

};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    A a;
    a.print();
   
    A b;
    b.print();
    b.set(45);
   
    A c;
    c.print();
   
    std::cout << "again" << std::endl;
    a.print();
   
    std::cout << "EBDL:" << a.mem.data() << std::endl; // Different
    std::cout << "EBDL:" << b.mem.data() << std::endl; // Pointers
    std::cout << "EBDL:" << c.mem.data() << std::endl; // Each time

    return app.exec();
}

Результат работы:
Код:
FTimeAttach: 1
0x2b92c000
45
FTimeAttach: 1
0x2bf5f000
45
FTimeAttach: 1
0x2bf60000
45
again
0x2b92c000
45
EBDL:0x2b92c000
EBDL:0x2bf5f000
EBDL:0x2bf60000

Бывало, что замечал разные указатели и в разных проектах. Что это и как это работает?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Июль 06, 2015, 10:51 »

Каждый QSharedMemory мапит в свой "логический адрес", вот и все. Вы же не удивляетесь что когда один экземпляр удален остальные работают, они независимы друг от друга. Хотя могут юзать физически одну память - это неск мапов, а не один шареный.

И напрасно Вы продолжаете болтить lock(), потом огребете на отладке - мало не покажется.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.043 секунд. Запросов: 23.