0 / 0 / 0
Регистрация: 04.04.2016
Сообщений: 20
1

Компилятор игнорирует явный конструктор копирования

08.04.2016, 10:25. Показов 1695. Ответов 36
Метки нет (Все метки)

Уже в который раз возникают проблемы с конструкторами класса и вот очередная из них. Насколько я понял, компилятор игнорирует явно написанный конструктор копирования и использует тот, что по умолчанию, в итоге в двух разных объектах поля last_name имеют один и тот же адрес, что вызывает ошибку при выполнении деструктора, который высвобождает динамическую память. Как заставить компилятор использовать мой конструктор копирования и если проблема не в этом, тогда что делать?
C++
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
#include <iostream>
using namespace std;
class account
{
public:
    int MAX = 50;
    account()
    {
        last_name = new char[MAX];
        strcpy_s(last_name, MAX,"Skuratovich");
    }
    
    account(const char *_last_name)
    {
        
        last_name = new char[MAX];
        strcpy_s(last_name, strlen(_last_name)+1, _last_name);
        cout << "я сработалъ!" << endl;
    }
    account(account& copy)
    {
        last_name = new char[MAX];
        strcpy_s(last_name, strlen(copy.last_name) + 1, copy.last_name);
        cout << "я сработалъ!" << endl;
    }
 
    ~account() { delete[] last_name; }
 
private:
    char *last_name;
 
};
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2016, 10:25
Ответы с готовыми решениями:

Явный конструктор копирования в c++
Когда в программе нужен явный конструктор копирования?

Объясните, зачем в коде нужен явный конструктор копирования
Добрый день, хочу понять код, почему тут обезательно надо явный конструктор копирования? ...

Явный и неявный конструктор
явный конструктор-это...? неявный конструктор-это...? спасибо.

Как использовать явный конструктор родительского класса?
Привет :) Вот код, строчка 43. Как использовать конструктор типа A(int), в классе C?...

36
2544 / 1203 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
08.04.2016, 10:33 2
Siarhey, в вашем коде нету main и и не видна проблема
0
Падаван С++
445 / 259 / 89
Регистрация: 11.11.2014
Сообщений: 905
08.04.2016, 10:37 3
Siarhey, Все хорошо он очищает, проблема скорее всего в другом куске кода, чтобы не заморачиватся с типом char используйте string
0
Jesus loves me
Эксперт С++
5196 / 3168 / 357
Регистрация: 12.12.2009
Сообщений: 8,007
Записей в блоге: 2
08.04.2016, 10:39 4
Проблема в том, что в твоем коде нет конструктора копирования. Правильно писать так
C++
1
2
3
4
    account(const account& copy)
    {
        // ....    
    }
0
Падаван С++
445 / 259 / 89
Регистрация: 11.11.2014
Сообщений: 905
08.04.2016, 10:41 5
Kastaneda, разве обязательно писать const, подебажил данный код и оно конструктор копирования видит, этой константностью ведь мы лишь говорим что ничего не поменяем в передаваемом как аргумент объекте
0
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
08.04.2016, 10:42 6
Во первых, у вас утечка памяти в вашем копирующем конструкторе. Что если у вас объект уже создан ( выделили память), а потом решили скопировать в него другой объект? Память выделится еще раз. А прежняя не удалится.
Попробуйте писать this->last_name
0
return (true);
1976 / 1111 / 219
Регистрация: 19.04.2011
Сообщений: 2,345
08.04.2016, 10:43 7
Цитата Сообщение от Kastaneda Посмотреть сообщение
Правильно писать так
"Правильно" и "нет конструктора" - немного разные вещи.
Константой мы просто обезопасим себя от изменения оригинала, не более.
0
Jesus loves me
Эксперт С++
5196 / 3168 / 357
Регистрация: 12.12.2009
Сообщений: 8,007
Записей в блоге: 2
08.04.2016, 10:43 8
Цитата Сообщение от obivan Посмотреть сообщение
разве обязательно писать const
да
Цитата Сообщение от obivan Посмотреть сообщение
подебажил данный код и оно конструктор копирования видит
в студии дебажил? Она позволяет так писать, но это не правильно. Другие компиляторы могут этого не понять, как мы видим на примере ТС.
0
Падаван С++
445 / 259 / 89
Регистрация: 11.11.2014
Сообщений: 905
08.04.2016, 10:44 9
Цитата Сообщение от Kastaneda Посмотреть сообщение
в студии дебажил
угу, тогда понятно
0
Jesus loves me
Эксперт С++
5196 / 3168 / 357
Регистрация: 12.12.2009
Сообщений: 8,007
Записей в блоге: 2
08.04.2016, 10:44 10
Цитата Сообщение от mimicria Посмотреть сообщение
Константой мы просто обезопасим себя от изменения оригинала, не более.
нет, const говорит, что это конструктор копирования в соответствии со стандартом, без const это не пойми что.
0
Падаван С++
445 / 259 / 89
Регистрация: 11.11.2014
Сообщений: 905
08.04.2016, 10:46 11
Pink_Pank, можно просто дописать
C++
1
if (last_name != nullptr) delete[] last_name;
но утечки там нет, потому что это конструктор, если бы это метод копирования был то да
0
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
08.04.2016, 10:47 12
Цитата Сообщение от obivan Посмотреть сообщение
Pink_Pank, можно просто дописать
Можно, но я этого не увидел в коде. )
0
return (true);
1976 / 1111 / 219
Регистрация: 19.04.2011
Сообщений: 2,345
08.04.2016, 10:47 13
Тем не менее, копирование срабатывает и без const
0
Падаван С++
445 / 259 / 89
Регистрация: 11.11.2014
Сообщений: 905
08.04.2016, 10:49 14
Pink_Pank, просто там и не должно же быть этого
0
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
08.04.2016, 10:50 15
obivan, это почему же? )) Вы и ТС не одно лицо случаем? ))
0
Падаван С++
445 / 259 / 89
Регистрация: 11.11.2014
Сообщений: 905
08.04.2016, 10:57 16
Pink_Pank, нет не одно ), просто мне интересно
Цитата Сообщение от Pink_Pank Посмотреть сообщение
Что если у вас объект уже создан ( выделили память)
как такое может быть, если конструктор копирования только создает сам объект, и он ну не может уже быть создан, да может быть выделена память вот в таком случае
C++
1
2
last_name = new char[MAX];
last_name = new char[MAX];
то что вы говорите, справедливо для перегрузки =, или своего метода копирования, но не как не для конструктора, я не думаю что ктото будет 2 раза выделять память а потом еще туда и проверку пихать )

Добавлено через 1 минуту
Pink_Pank, ну или приведите пример, того о чем вы говорите, без них никуда
0
return (true);
1976 / 1111 / 219
Регистрация: 19.04.2011
Сообщений: 2,345
08.04.2016, 10:57 17
Цитата Сообщение от Kastaneda Посмотреть сообщение
что это конструктор копирования в соответствии со стандартом
Прошу прощения за древний текст, но:
12.8 Copying class objects
2. A nontemplate constructor for class X is a copy constructor if its first parameter is of type X&, const X&,
volatile X& or const volatile X&, and either there are no other parameters or else all other parameters have default arguments
1
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
08.04.2016, 10:58 18
C++
1
2
3
account* pAcc = new account();
account* p2Acc = new account();
new (pAcc) account(*p2Acc);
Placement new посмотрите
1
Падаван С++
445 / 259 / 89
Регистрация: 11.11.2014
Сообщений: 905
08.04.2016, 11:03 19
Pink_Pank, ну честно говоря, это уже некий хак, так копировать объекты, но если уж так хочется, то тогда лучше создать метод для копирования и вызывать его и скажите вы действительно так пишете ?) когда допустим прегружено =, и есть методы копирования

P.S честно говоря про такое не знал, но что тогда будет с другими полями, допустим не указателями, подкинем мы поле int, и что оно 2 раза будет создаватся, а декструктор тогда как с этим справтся
0
47 / 31 / 21
Регистрация: 04.04.2016
Сообщений: 209
08.04.2016, 11:05 20
Это не хак. попробуйте-ка выделить через new память для массива из классов и сразу же их в этой форме проинициализировать. Не получится. у вас классы создадутся при помощи конструктора по умолчанию.
А чтобы их проинициализировать нужен либо Placement new, либо отдельный инициализирующий метод
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2016, 11:05

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных...

Конструктор класса, конструктор копирования запускается не тот который нужен
Есть такой конструктор: Neuron::Neuron(int iType_activation_funk) { this-&gt;iType_act =...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include...

Компилятор игнорирует функции cin, if, for
После запуска программа дает ввести только строку. После чего выбивается весь cout, игнорируя и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.