Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

new и время жизни

30K
11 декабря 2011 года
Gaidukov-maxim
28 / / 25.02.2008
Здравствуйте. Вот такой небольшой вопросик. Есть класс с прегруженным конструктором:
Код:
public class OString {          //Серия символов ASCII,  заканчивающаяся символом  NULL.
public:          INT32 Length;
        char* LinePtr;
        OString( char from[]="")
        {
            INT32 i;
            for (i=0; from!= '\0';i++)
            {}
            Length=i+1;
            LinePtr =new char [Length];
            strcpy(LinePtr,from);
        }
        OString(char from[], INT32 sz)
        {//Принимается указатель на массив и его размер (sizeof())
            Length=sz;
            LinePtr = new char[sz];
            strcpy(LinePtr,from);
           
        }
};

Так вот вопрос, при уничтожении объекта данного типа память выделенная оператором new будет освобождаться или нужно переопределять деструктор?
394
11 декабря 2011 года
MegaMozg
317 / / 18.03.2006
сама память освобождаться не будет, нужно освобождать вручную в деструкторе
277
11 декабря 2011 года
arrjj
1.7K / / 26.01.2011
:facepalm:
1. Работая с указателями работайте с указателями *
2. Есть такая прекрасная функция strlen
3. Для копирования памяти указанной длины используйте memcpy и в конец добавляйте символ '\0'
30K
12 декабря 2011 года
Gaidukov-maxim
28 / / 25.02.2008
Цитата: arrjj
:facepalm:
1. Работая с указателями работайте с указателями *
2. Есть такая прекрасная функция strlen
3. Для копирования памяти указанной длины используйте memcpy и в конец добавляйте символ '\0'



Спасибо за подсказку. Я просто начинающий.;)

30K
12 декабря 2011 года
Gaidukov-maxim
28 / / 25.02.2008
Ну так вот. Деструктор имеем следующего вида.
 
Код:
~OString()
        {
            if (LinePtr != NULL)  delete [] LinePtr;
            if (this != NULL)delete this;
        }


Далее

 
Код:
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                           
                SMPP::BasicTypes::OString str="fffffffffffffff";
           
             }

Возникает ошибка при завершении блока.
[ATTACH=CONFIG]5443[/ATTACH]
277
12 декабря 2011 года
arrjj
1.7K / / 26.01.2011
1) if (this != NULL)delete this;//не нужно
2) перегрузи operator = или SMPP::BasicTypes::OString("fffffffffffffff");

ну а вообще ошибка не понятная - больше кода нужно посмотреть
30K
12 декабря 2011 года
Gaidukov-maxim
28 / / 25.02.2008
Я тут что-то прочитал про конструктор копирования.
Если я правильно понял, то как-то вот так, И = перегружать не надо.?

 
Код:
OString(const OString &cpy)
        {
            LinePtr = new char [cpy.Length];
            memcpy(LinePtr, cpy.LinePtr, cpy.Length);
            Length=cpy.Length;
        }

Такое можно?
30K
12 декабря 2011 года
Gaidukov-maxim
28 / / 25.02.2008
Хотя без перегрузки = видимо не обойтись....
30K
12 декабря 2011 года
Gaidukov-maxim
28 / / 25.02.2008
 
Код:
Ostring& operator=(OString& obj)
        {
            Length=obj.Length;
            LinePtr=new char[obj.Length];
            memcpy(LinePtr,obj.LinePtr,obj.Length);
            return *this;
        }

Выдает аж 4 ошибки


1>SMPP34.cpp
1>... error C2143: syntax error : missing ';' before '&'
1>... error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>... error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>... error C2440: 'return' : cannot convert from 'SMPP::BasicTypes::OString' to 'int &'

Смотрю аналогичные коды. Все вроде так. Но почему ошибки?....
30K
12 декабря 2011 года
Gaidukov-maxim
28 / / 25.02.2008
пардон просмотрел Ostring&
297
13 декабря 2011 года
koodeer
1.2K / / 02.05.2009
Цитата: Gaidukov-maxim
Ну так вот. Деструктор имеем следующего вида.
 
Код:
~OString()
        {
            if (LinePtr != NULL)  delete [] LinePtr;
            //if (this != NULL)delete this; // это не нужно!
        }


В деструкторе нужно освободить все занимаемые ресурсы. Но самого себя удалять не нужно.



Цитата: Gaidukov-maxim
 
Код:
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                           
                SMPP::BasicTypes::OString str="fffffffffffffff";
           
             }


Опять :(. Опять смесь управляемого и неуправляемого кода :(.

Мой вам совет: если хотите освоить нативный C++, то не используйте проект WindowsForms. А если нет пока понимания, чем отличается управляемый от неуправляемого кода, если нет понимания, что такое платформа .NET, то лучше всего взять вместо Visual Studio другую среду разработки, в которой нет поддержки .NET. Там невозможно будет намешать в кучу и то, и другое.

А знакомство с управляемым кодом лучше начать с языка C#. После некоторого его освоения, при необходимости соединения кода с нативным C++, можно будет переключиться на C++/CLI.

30K
13 декабря 2011 года
Gaidukov-maxim
28 / / 25.02.2008
Цитата: koodeer
В деструкторе нужно освободить все занимаемые ресурсы. Но самого себя удалять не нужно.




Опять :(. Опять смесь управляемого и неуправляемого кода :(.

Мой вам совет: если хотите освоить нативный C++, то не используйте проект WindowsForms. А если нет пока понимания, чем отличается управляемый от неуправляемого кода, если нет понимания, что такое платформа .NET, то лучше всего взять вместо Visual Studio другую среду разработки, в которой нет поддержки .NET. Там невозможно будет намешать в кучу и то, и другое.

А знакомство с управляемым кодом лучше начать с языка C#. После некоторого его освоения, при необходимости соединения кода с нативным C++, можно будет переключиться на C++/CLI.



Да понятно, что нехорошо это. Свой код я пишу на нативном (кажется), а Windows Forms использую для простоты. Нажал кнопку и посмотрел результат. Конечно есть другие способы для этого, возможно более простые. Но я их не очень понимаю. Например, в консольное мне кажется староватым, а WinAPI и MFC сложноватым по сравнению c .Net.

7
13 декабря 2011 года
@pixo $oft
3.4K / / 20.09.2006
Консольное «староватым» быть не может.Вы ещё пользователям Unix скажите,что у них вся система старая:)
Консоль—это когда не надо тратить много времени на интерфейс,ибо он предполагает только простейшее взаимодействие.WinAPI—не так уж и сложно,главное—понять основы.А в .Net всё слишком уж упрощено и для всего есть велосипеды(однако,некоторые умудряются изобретать свои:))
30K
15 декабря 2011 года
Gaidukov-maxim
28 / / 25.02.2008
Хм.... Я тоже имею свойство к словам придираться... наверное это качество программиста)))). Изобретать свои велосипеды не так плохо. Я бы сказал хорошо. Потому что все начинаешь понимать с основ. Когда делаешь по книге или по наработкам не видишь полной картины, а вот когда все с нуля....
Всем спасибо.
Разобрался и с конструкторами и с перегрузкой =
41K
17 декабря 2011 года
kisssko
108 / / 28.10.2010
Цитата: Gaidukov-maxim
Изобретать свои велосипеды не так плохо. Я бы сказал хорошо. Потому что все начинаешь понимать с основ.
Когда делаешь по книге или по наработкам не видишь полной картины, а вот когда все с нуля....


Да, хорошо... В процессе обучения. А вот для практических разработок не всегда хорошо.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог