Название: QSharedMemory указатели
Отправлено: 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
Бывало, что замечал разные указатели и в разных проектах. Что это и как это работает?
Название: Re: QSharedMemory указатели
Отправлено: Igors от Июль 06, 2015, 10:51
Каждый QSharedMemory мапит в свой "логический адрес", вот и все. Вы же не удивляетесь что когда один экземпляр удален остальные работают, они независимы друг от друга. Хотя могут юзать физически одну память - это неск мапов, а не один шареный.
И напрасно Вы продолжаете болтить lock(), потом огребете на отладке - мало не покажется.
|