Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что-то непонятное с копированием простого класса / 5 сообщений из 5, страница 1 из 1
09.08.2013, 16:59
    #38361319
tolyanchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то непонятное с копированием простого класса
Решил попробовать, насколько быстр хвалёный std::move() ... но так и не дошёл до него.


Для начала создал примитивный класс-обёртку над динамическим массивом.
Реализовал копирование, начал тупо возвращать по значение - не тут то было.
Ошибка времени выполнения, пишет про коррумпированную кучу :)
Причём нестабильно так, фиг поймёшь.

Проверил на студии и codepad.org


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
#include <iostream>
#include <ctime>

class ArrayWrapper {

public:

	static const int DEF_SIZE = 64;
	int* root;
	int size;

	ArrayWrapper(int s = DEF_SIZE){

		cout << "Ctor" << endl;
		root = new int[s];
		size = s;	
	}

	ArrayWrapper(const ArrayWrapper& other){
		
		cout << "Copy ctor" << endl;
		root = new int[other.size];
		size = other.size;

		for (int i = 0; i < size; i++){

			root[i] = other.root[i];
		}	
	}
	
	ArrayWrapper& operator=(const ArrayWrapper& other){

		cout << "Operator= " << endl;

		if (this == &other){

			return *this;
		}

		delete[] root;

		root = new int[other.size];

		for (int i = 0; i < other.size; i++){

			root[i] = other.root[i];
		}

		size = other.size;		
	}

	~ArrayWrapper(){

		cout << "Dtor" << endl;
		
		if (root != 0){

			delete[] root;			
		}
	}
};

ArrayWrapper getWrapper(int n){

	ArrayWrapper aw(n);

	for (int i = 0; i < n; i++){

		aw.root[n] = rand();
	}

	return aw;
}


int main(){

	srand(time(0));

	const int N = 16;
        int total = 0;

	cout << "N = " << N << endl;	

	for (int i = 0; i < N; i++){

		ArrayWrapper aw = getWrapper(N);

		for (int j = 0; j < N; j++){

			if (aw.root[j] == 666){

				total++;
			}
		}
	}

	cout << "Total = " << total << endl;

	return 0;
}
...
Рейтинг: 0 / 0
09.08.2013, 17:57
    #38361429
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то непонятное с копированием простого класса
tolyanchik,

а у тебя только в приведенном здесь коде ArrayWrapper& operator=(const ArrayWrapper& other) ничего не возращает в случае неравенства указателей?
...
Рейтинг: 0 / 0
09.08.2013, 18:26
    #38361478
tolyanchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то непонятное с копированием простого класса
Не дописал, но проблема кажись не в нём?
...
Рейтинг: 0 / 0
09.08.2013, 18:30
    #38361485
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то непонятное с копированием простого класса
tolyanchik,

Ошибка здесь
Код: plaintext
1.
aw.root[n] = rand();


выход за границы массива из-за опечатки (n вместо i)
...
Рейтинг: 0 / 0
09.08.2013, 18:33
    #38361486
tolyanchik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то непонятное с копированием простого класса
Да что же за д.......м такой!

Действительно, глупость безгранична, спасибо всем!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что-то непонятное с копированием простого класса / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]