LINUX.ORG.RU
Ответ на: комментарий от shty

> скомпилил? :)

Да. Для всех элементарных типов были введены «конструкторы» по умолчанию и «конструкторы копирования» (присвоение нуля и присвание элемент)

Ибо в противном случае в шаблонох был бы полный пи...

и не зря... для таких целей используй boost::shared_ptr

Ты же сам говорил о затратности данной штуки. Не всегда это выгодно.

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

> скомпилил? :)

Да.

теперь компилим, запускаем и наслаждаемся :)

(требуемые хедеры, надеюсь, подключишь)

class A {
public:

	A() : p() { }

	A(const char* str){
		size_t str_size = sizeof(char*)*strlen(str);
		p = (char*)malloc(str_size);
		strcpy_s(p, str_size, str);
	}

	~A() {
		free(p);
	}

	char* p;
};

void print_value(A a) {
	std::cout << a.p << std::endl;
}

int main(int argc, char** argv[])
{
	A a("pssst");

	print_value(a);

	std::cout << a.p << std::endl;

	return 0;
}
shty ★★★★★
()
Ответ на: комментарий от namezys

> и не зря... для таких целей используй boost::shared_ptr

Ты же сам говорил о затратности данной штуки. Не всегда это выгодно.

ой-вей! то было совсем не про то что «эту штуку» использовать не надо, а о том что надо думать при её использовании :)

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

Я же о другом писал. тут же вызов контсркутора копирования

а о том что надо думать при её использовании

в с++ вообще думать надо :)

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

Я же о другом писал. тут же вызов контсркутора копирования

эммм... напомню о чём речь шла

dialogue

- если компилятор не находит конструктор копии в классе, то он его дописывает туда самостоятельно, но все члены класса копируются простым присваиванием (shallow copy), то есть если у нас есть член класса который является указателем то ему будет присвоен новый адрес и всё... при этом старая область памяти на которую он указывает «утекает», так как на неё уже никто не ссылается, а на область памяти на которую указывала присваиваемая переменная указывают 2 указателя

- А не конструкторы копирования ли он вызывает?

- ога, у char* :)

- Да. Для всех элементарных типов были введены «конструкторы» по умолчанию и «конструкторы копирования» (присвоение нуля и присвание элемент)

так вот конструктор копирования по умолчанию делает тупое побитное копирование и, следовательно, просто копирует адрес из одного указателя в другой

для встроенных типов нет конструкторов копии!

естественно когда он копирует экземпляр класса 1 в экземпляр класса 2 то вызывается конструктор копии экземпляра класса 1 :) но то не про ссылки!

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