LINUX.ORG.RU

Qt:memcpy: не копируются данные


0

1

Есть класс A:

class A {
  ...
public:
  void *a, *b;
  C *c;
  ma();
}

Нужно скопировать данные из b в a в потоке. Для этого создаю:

class C: public QThread {

public:

	int size;
	void *a1, *b1;

	void setCpyParam(void *dst, void *src, int size) {
		b1 = src;
		a1 = dst;
		size = size;
	}

	void run() {
		memcpy(a1, b1, size);
	}
};

Основной код ma():

...
   a = (void *) data_a;
   b = (void *) data_b;
   c = new C();
   c->setCpyParam(a, b, size);
   c->start();
...
Копирование данных не происходит, хотя указатели a1, b1 - правильные. Прога запущена из под рута, может с доступом в потоке что-то ?


Что передается в size? Как вы определили что копирования не происходит? Почему вы вообще решили, что в C++ можно так копировать классы?

anonymous
()

Не пиши так больше.

А если во время копирования память кто-то очистит? Или напишет туда что-нибудь ещё?

И как ты проверяешь, что не происходит копирования? Завершения потока точно дожидаешься?

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

Что сказать то хотел? Потоки в куте через QThread::start и запускаются, который в свою очередь дёргает виртуальный run.

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

> И как ты проверяешь, что не происходит копирования?

Я знаю данные (тестовые) в источнике и после копирования вывожу их (из приемника) в файл. Порча данных не возможна (я привел только кусочег ) кода) )

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

Сорри, а кто копирует классы ?

их конструкторы копий

memcpy нельзя применять к не-POD типам данных, иначе шанс фатально огрести сильно повышается

shty ★★★★★
()

Не любите себе и окружающим мозг, а просто напишите конструктор копирования.

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

>Я знаю данные (тестовые) в источнике и после копирования вывожу их (из приемника) в файл

И как ты определяешь, что копирование завершено?

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

> memcpy нельзя применять к не-POD типам данных

Копируемые данные (*a, *b) просто указатели на массивы.

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

1. Передаешь в поток указатель на источник.
2. Создаешь копию с помощью конструктора.
3. PROFIT

Даже все детали плана Вам раскрыл! Никаких ???

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

> 2.

В потоке данные копируются и обрабатываются, а основной поток должен «бежать» дальше (синхронизация присутствует ). Но вопрос-то в том, что даже в самом примитивном случае (тупое копирование и ожидание) данные не копируются...

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

> 2. Создаешь копию с помощью конструктора.

Наверное туплю ) Но объект (в примере С) в котором запускается поток (метод run()) уже создан какой еще конструктор в потоке ? Ну или можно поподробней )

drZlo
() автор топика

> size = size;

Шыкарно! Странно, что компилятор не выдает предупреждение.

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

Вот оно. Так лохануться (( Спасибо !!!

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

memcpy нельзя применять к не-POD типам данных, иначе шанс фатально огрести сильно повышается

Ага, учитывая, что Undefined Behavior из стандарта формально имеет право приводить к чему угодно, включая термоядерный взрыв и честные выборы в России.

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