Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Динамическое размещение объекта в определённом мес


Автор: Compositum 4.10.2013, 17:54
Доброго времени суток.

В C++ имеется возможность размещать объект по чётко определённому, указанному разработчиком, адресу в памяти. В свете этого у меня возник вопрос об освобождении памяти, использованной таким образом. 

Пусть, к примеру, у меня имеется некоторый массив объектов char (выделенный ранее динамически) и указывающий на адрес, по которому вдруг потребовалось разместить объект некоторого класса A. 

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

Интуитивно считаю, что в третьем варианте память должна освобождаться (деструктор там я вызываю вручную, иначе он не будет вызван). Оператору delete указываю "родной" указатель типа char, которому и была изначально выделена память. 

Но вот первый и второй вариант... С одной стороны, я использовал new, а с другой - я ведь не выделял новую память, а указал адрес уже выделенной ранее... Вот что в данном случае происходит? Происходит ли освобождение памяти, или же всё ограничивается банальным вызовом деструктора без последующего освобождения памяти? Как можно определить, произошло ли освобождение памяти? Может какой инструмент для этого имеется в GCC и MS Visual Studio 2012?

Код

#include <iostream>
#include <exception>
using namespace ::std;

class A{
private:
    double x;
public:
    A() : x(0) { cout << "A class; ptr: " << this << " created." << endl; }    
    ~A() { cout << "A class; ptr: " << this << " destroyed." << endl; }
};

int main(int argc, char* argv[])
try{    
    int x = -1; // Variants of memory clearing
    while (x < 0 || x > 2) {
        cout << "Variant (0,1,2): ";
        cin >> x;
    }
    char* p = new char[sizeof(A)]; // some memory area...
    
    A* a = new(p)A(); // Place my object in the 'p' address.
    
    // Here is my basic work to do...
    
    // Now I must to free my memory:
    if(!x){ // First variant
        delete a;            
    }
    else if (x == 1){ // Second variant
        delete reinterpret_cast<A*>(p);    
    }
    else if (x == 2){ // Third variant
        a->~A();        
        delete[] p;    
    }
    else{
        throw runtime_error("Invalid variant!");
    }
    a = nullptr;
    p = nullptr;
    
    cout << endl;    
}
catch(exception& e){
    cerr << e.what() << endl;
    return 1;
}
catch(...){
    cerr << "Unknown exception." << endl;
    return 2;
}


Спасибо.

Автор: volatile 4.10.2013, 18:06
третий вариант правильный.
первые два использовать нельзя.

т.е. если было так:
Цитата(Compositum @  4.10.2013,  17:54 Найти цитируемый пост)
   char* p = new char[sizeof(A)]; // some memory area...
    A* a = new(p)A(); // Place my object in the 'p' address.


то удалять нужно так:
Цитата(Compositum @  4.10.2013,  17:54 Найти цитируемый пост)
        a->~A();        
        delete[] p;


Автор: Compositum 4.10.2013, 18:10
Цитата(volatile @ 4.10.2013,  18:06)
первые два использовать нельзя.

А вот почему (хочу понять)? Ведь все указатели указывают на одну и ту же ячейку памяти и объект занимает столько же байт...

Автор: volatile 4.10.2013, 18:23
Compositum, есть такая вещь как стандарт, там написано что можно и что нельзя.
а почему... это вопрос риторический.

дофига разных почему можно задать.
например почему нельзя сдвигать отрицательные числа? ну вот почему?!
нельзя. и пепец. все.

Потому-что разработчики компиляторов ориентируются на стандарт.
И если там написано что нельзя, то они это в праве и не реализовывать.

Добавлено через 1 минуту и 15 секунд
ну, может кто ответит более внятно..почему..

Автор: o2n3e 4.10.2013, 19:01
Цитата

   В C++ имеется возможность размещать объект по чётко определённому, указанному разработчиком, адресу в памяти.
   

Не имеется. Вначале осиль указатели, перед тем, как задавать вопросы из ада. В твоём случае первая половина new(), а именно аллокатор заменяется на какой-нибудь cast(), а вторая его половина вызывает твои конструкторы и прочее.


Код

char * p = new char[sizeof(A)];
A * ptr = (A *)p;//как там у вас положенно писать касты я не знаю.
//тут new вызывает твой конструктор от A.



Это ничем не отличается от простого new. Деструктор не влияет на твой "объект", поэтому его один хрен надо удалять, либо юзай "стек".


Портянка твоя ужасна, бесполезна и мне даже лень её читать.




Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//Динамическое-размещение-объекта-в-определённом-мес-id524ed73eae2015845c000002#findElement_E7045_524ee650ae2015066f00017e_0

Автор: o2n3e 5.10.2013, 21:23
Нет никаких нельзя - есть УБ и гарантии. Т.е. есть вещи, которые работают 100% так, а есть те, которые хрен знает как работают. Естественно реально никаких УБ нет и это всё отстранённая от реального мира брехня.


Те же сдвиги. Сдвигать можно всё - только за результат отвечает уже не стандарт, а знание матчасти. Если у тебя есть знаковые сдвиги, либо их софтварный аналог и ты знаешь что из себя представляют псевдознаковые числа - то сдвигать тебе их ничего не мешает. Формально да - это уб, но реально формат записи знака везде один, знаковые сдвиги есть много где, а если нет, то ~/конпелятор тебе в руки. И то, это даже не уб, а "результат немного не такой, как в учебнике".



Там не написанно "нельзя" - там написанно: "уб". Нет такой вещи в сишке, как "нельзя". Там нельзя максимум синтаксическое. А уб "разработчики конпелятора" в праве не не реализовывать, а реализовывать так, как хотят. Реально, если конечно конпелятор писали не адепты паскалятинки ака "динща из ада"(привет мелкософт), то реализацию у УБ всегда ~= одной. Хотя это больше не "днища из ада", а вендорлок.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//Динамическое-размещение-объекта-в-определённом-мес-id524ed73eae2015845c000002#findElement_E7045_52505912ae2015e610000068_0

Автор: o2n3e 5.10.2013, 22:11
Запомни раз и навсегда - кто тебе отвечает ответами вида: "стандарт", "уб", "потомучто" - дно из ада.


По поводу твоего вопроса - я тебе уже объяснил почему.


Код

#include <iostream>
#include <stdint.h>
#include <stdio.h>

using namespace std;

class A{
private:
    double x;
public:
    A() : x(0) { cout << "A class; ptr: " << this << " created." << endl; }    
    ~A() { cout << "A class; ptr: " << this << " destroyed." << endl; }
};

int main(int argc, char **argv) {
  char * p = new char[sizeof(A)]; // some memory area...
  fprintf(stderr, "%p\n", p);
  A * a = new(p)A(); // Place my object in the 'p' address.
  fprintf(stderr, "%p\n", a);
  delete a;
  p = new char[sizeof(A)];
  fprintf(stderr, "%p\n", p);
}


Это работает везде и будет работать. new/delete - банальная обвязка над маллоком, вернее оператор new/delete. Сам же new/delete просто вставляет конструктор/деструктор не более.


Аллокатор клал на твои классы/не классы. Вообще никаких классов нет. Поэтому похрен что ты там удаляешь, ибо оператор delete не знает тип. Узнаёт он его либо из иннода, который стоит левее от твоего указателя. *(uint64_t *)((uintptr_t)p - 16(8)). "Инноды" могут хранится вообще в другом месте, либо их может не быть, но в любой вменяемой реализации оператор delete будет класть на типы.


Но суть в том, что это поведение не определенно в стандарте - поэтому любой идиот может запилить так, что оператор delete будет зависить от типа и этому коду прийдёт конец( вернее конпеляция отвалится и у тебя бы этого вопроса не возникло). Хотя я даже не представляю зачем это надо и в чём будет профит. Это можно юзать для "быстрой" аллокации контантных величин, которые не будут задействовать райнтайм и все проверки делать в компилтайме.


Допустим, если у тебя есть "иннод" от твоего кусочка, то можно проверить релаьно ли он выделен, либо уже нет. Поэтому ты можешь хоть 100500 раз юзать delete, который при первом вызове затерёт иннод и дальше работать не будет. Сдесь же конпелятор должен будет чекать весь твой код. Причем работать будет лишь для локального мусора.


Т.е. delete p; реально работает и будет работать везде, но это уб и идиоты тебя за это не погладят.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com//Динамическое-размещение-объекта-в-определённом-мес-id524ed73eae2015845c000002#findElement_E7045_52506468ae2015af150001d8_0

Автор: volatile 6.10.2013, 02:27
Цитата(o2n3e @  5.10.2013,  22:11 Найти цитируемый пост)
Запомни раз и навсегда

имхо, новый троль какойто.
предвижу некоторое оживление форума..  smile 
интонации хороши.
научит щас всех уму разуму.

Автор: o2n3e 6.10.2013, 15:14
Новый тролль. В чём тролль? Давай, обоснуй мне попоцаночке.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Динамическое-размещение-объекта-в-определённом-мес-id524ed73eae2015845c000002#findElement_E7045_5251542eae201538450000cd_0

Автор: akizelokro 6.10.2013, 16:36
Всё это глубоко индивидуально. Но уточню терминологию.
К примеру, старый стиль, ещё из Сишника вывода на экран в DOS-программах. Записываешь символы в определенную область памяти (с 0х8000 начинается чтоли, если мне моя память не изменяет) и ничего освобождать не надо. У тебя же не 
Цитата

размещать объект по чётко определённому, указанному разработчиком, адресу в памяти
,
а размещается объект в памяти, предварительно выделенной с помощью оператора new.

Дальше, останавливаться на том, что нежелательно ввод-вывод в потоки производить в деструкторе, думаю, не нужно.
Ну, и дальше малость посмотрел. Есть чистый ООП стиль (который ещё не отменил функцию malloc), есть стиль Сшных программистов (откуда функция malloc и появилась). ДУмаю, что незачем их смешивать, потому что из-за путаницы в стилях ухудшается внутренняя логика кода.

Автор: o2n3e 6.10.2013, 18:58
DOS - это говнище из ада, которое к вопросу ниеимеет никакого отношение. Это мёртворождённое говно, которое было ущербно со дня своего появления и во время своей популярности, но почему-то было популярно.


Всё это - это аллокаторы и руление кучей - это всё абстракции рантайма и к памяти никакого отношения не имеют. Аллокаторы существуют только на уровне ОС и процессора, если ты юзаешь виртпамять.


У тебя же небыло кучи как таковой - у тебя банальная прямая адресация памяти, которая протухла лет 200назад.


Нет, никаких объектов нет, никакая память не выделяется, и никакйо new за неё не отвечает. new - это абстракция над рантайм кучей, которая к памяти отношения не имеет.


Есть стиль тех, кто понимает, что такое память, а есть тех, кто не понимает. Маллок - это студенческое говно, либо просто заюзанный для совместимости вызов в примитивном коде. Это не ООП стиль - это ООП кастыль, ибо new - это не только "аллокатор"(оператор new), а ключевое словое языка - как кой-нибудь return. Именно в этом и есть различие, а не в каких-то там стилях. А оператор new - это банальная обвязка над маллоком почти во всех либс++.


Никакой путаницы нет. Никакая логина не ухудшается, ибо просто конструкторы/деструкторы не вызваются. А поверье "юзай new/delete" - пошла потому, что тупая животные не могли запомнить простую вещь: "маллок для стандартных тимов, new для классов с конструкторами". И лепили маллок где попало.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Динамическое-размещение-объекта-в-определённом-мес-id524ed73eae2015845c000002#findElement_E7045_525188acae2015375200082f_0

Автор: EgoBrain 7.10.2013, 04:46
Цитата(volatile @  6.10.2013,  02:27 Найти цитируемый пост)
имхо, новый троль какойто.
предвижу некоторое оживление форума..  smile 
интонации хороши.
научит щас всех уму разуму.


volatile, мне твоя позиция немного непонятна. Троль как то убедительно вещает, особенно для незнающего читателя. Надеюсь местные авторитеты если нужно где-то подправят его.

Автор: o2n3e 7.10.2013, 10:23
Тут нет таких авторитетов, котоыре осмеляться править меня - максимум они будут защищать свою шкурку от моей ненависти к досу и программистам не знающих матчасть, но называющих себя программистами.


Я вообе не понимаю, но юзал ты дос - посмейся нам этим и забудь как страшный сон, это как с паскалятинкой. Забудь и посмейся, аля: "был идиотом - бывает". Нет жешь они будут это говно защищать только лишь потому, чтобы о них не подумали, что они юзали говно.



Если я раньше юзал плюсы, то я забыл это как страшный сон. И согласен, что был дураком.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Динамическое-размещение-объекта-в-определённом-мес-id524ed73eae2015845c000002#findElement_E7045_52526178ae2015e827000324_0

Автор: baldina 7.10.2013, 10:53
троля-ля...

EgoBrain, а его почти негде править, все правильно сказал. хитрость заключается в тонкой границе между техникой и методологией: технически правильные и работающие вещи могут быть ужасными с точки зрения ремонта и прочего сопровождения. крутизна не в том, что оно работает, а что всем понятно - как.

Автор: xvr 7.10.2013, 15:04
Цитата(Compositum @  4.10.2013,  18:10 Найти цитируемый пост)
А вот почему (хочу понять)? Ведь все указатели указывают на одну и ту же ячейку памяти и объект занимает столько же байт... 

Потому что new/delete это не только malloc/free, но и вызов конкретных коснрукторов/деструкторов. И если для malloc/free важен только кусок памяти, с которым их попросили поработать, то для конструкторв/деструкторов важен ТИП того, что в этой памяти лежит. 1й и 2й вариант дают неправильную информацию о типе.

И вообще - удалением памяти должен заниматься тот, кто ее выделял. Placement new не выделяет память (он использует готовую), это значит, что вызывать обычный delete на этот участок памяти нельзя.

Автор: o2n3e 8.10.2013, 07:14
Какие люди, ты издеваешься надо мной? Ты сюда пришел, шут, смешить меня своими третьесортными недознаниями с задней парты? Причем это очередная недокопипаста, после того, как я написал все по-пацаночке?


Для начала осиль мануал, оператор new/delete и есть malloc/free. Вызов деструкторов - это совершенно другая часть языка, которая так же клала на рантайм типы(типы, которые лежат там в твоей памяти). Поэтому ей важен лишь твой тип указателя, к которому ты её вызываешь, и даже если там будут нули - она всё ровно вызовит деструктор, ибо реально - это вызов отдельной функции.


Рантайм вызовы - это виртфункции, которые работают совершенно по иному, и им уже важно что лежит, но даже в этом случаее - похрен чем ты там "выделял память". Вариант delete p; работает во всех случаях.


И вообще, может ты не будешь нести херню, ученик с задней парты? А значит, если ты подучишь матчасть - ты поймёшь, что оператор new/delete клали на тип, и даже если ты указатель кастанёшь в воид - он будет его "удалять".



Очередной твой горевыхлоп, который не имеет отношения к реальному миру. Уйди отсюда, и больше, при мне, такую гнилую портянку не катай.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Динамическое-размещение-объекта-в-определённом-мес-id524ed73eae2015845c000002#findElement_E7045_52538697ae2015c11300101e_0

Автор: baldina 8.10.2013, 10:39
o2n3e, полегче, грубить не надо. пафос приводит к нервозности, нервозность - к ошибкам.

"по мануалу" оператор new/delete не есть malloc/free

вызов деструкторов учитывает рантайм тип (если программист озаботился виртуальным деструктором). хотя говорить о рантайм типах в языке со статической типизацией и фактическим отсутствием в рантайм информации о типах дело неблагодарное smile 

виртуальным функциям все равно что там лежит: это их вызывают, а не они. 

все предопределено еще на стадии компиляции, движуха обеспечивается обобщением скаляра до функционала - заменой адреса на механизм виртуализации.

апелляция к реализации возможна в частном случае, если он явно указан, но единственная реальная опора - стандарт.

Автор: xvr 8.10.2013, 11:43
Цитата(o2n3e @  8.10.2013,  07:14 Найти цитируемый пост)
Для начала осиль мануал, оператор new/delete и есть malloc/free.

Быстро учить матчасть. Как выучишь - приходи учить других. А пока посиди в бане - отдохни и остудись 

Автор: o2n3e 8.10.2013, 14:04
123

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Динамическое-размещение-объекта-в-определённом-мес-id524ed73eae2015845c000002#findElement_E7045_5253e6d1ae20156b05000a5a_0

Автор: o2n3e 8.10.2013, 22:19
Модератор: Сообщение скрыто.

Автор: o2n3e 8.10.2013, 22:38
Модератор: Сообщение скрыто.

Автор: akizelokro 9.10.2013, 19:36
Цитата(o2n3e @  6.10.2013,  18:58 Найти цитируемый пост)
DOS - это говнище из ада, которое к вопросу ниеимеет никакого отношение. Это мёртворождённое ###, которое было ущербно со дня своего появления и во время своей популярности, но почему-то было популярно.

Это всё - лирика. На этом шли заказы, а дальше лишь уже можно говорить, что там лучше, винда или полуось, или винда или линукс. Когда заказ сделан, можно заняться и эстетикой.

Цитата(o2n3e @  6.10.2013,  18:58 Найти цитируемый пост)
Есть стиль тех, кто понимает, что такое память, а есть тех, кто не понимает. Маллок - это студенческое ###, либо просто заюзанный для совместимости вызов в примитивном коде. Это не ООП стиль - это ООП кастыль, ибо new - это не только "аллокатор"(оператор new), а ключевое словое языка - как кой-нибудь return. Именно в этом и есть различие, а не в каких-то там стилях. А оператор new - это банальная обвязка над маллоком почти во всех либс++.

Ну, можешь считать и так. Но здесь начнётся уже опять стародавний спор о преимущестах обьектно-ориентированной парадигмы, функциональный или структурной. По крайней мере, принятно,  что знание ассемблера обязательно для системных программистов С++. А здесь уже точно весело. smile 
А дальше берётся и читается Страуструп или кто-то из идеологов ООстиля. И вспоминается простая истина, что ООП сделано для индустрии, в которой пишет один, отлаживать может другой, править третий. И желательно, чтобы код был понятен, а ещё лучше, чтобы в нем не было непривычных выкрутасов (комментарии в помощь)

Автор: o2n3e 10.10.2013, 06:53
Модератор: Сообщение скрыто.

Автор: akizelokro 10.10.2013, 13:49
Цитата(o2n3e @  10.10.2013,  06:53 Найти цитируемый пост)
Я считаю, а не могу. И не никто лучше меня считать тут врядли сможет.

Успокойся, гражданин. Холивар, что лучше, полуось или винда, помню. Холивар, что лучше, винда или линукс, помню. Холивара по поводу доса не было.
Скажу тебе страшное, мне вообще на дос или какая операционка, начихать. Все мои холивары закончились в тот момент, когда я от нефикх делать поставил на одну тачку три операционки и написал что-то помимо под линукс, ещё и под полуось. А дальше я во всех холиварах просто подтрунивал над спорящими сторонами. Ибо, никто не идеален.

Цитата

И какие такие "системные С++ программисты". Не смеши мои тапки.

Ну, есть ребятки, которые пишут всякую "шнягу" и "байду". Есть прикладники, есть системщики. Часть системщиков использует С++ (а не С). Я сам удивился, пока не пообщался с некоторыми штатовцами в онлайне.

Цитата

Забыл одну очень важную вещь - мейнстрим - это пристанище бездарей и самое дно ада. Меня не интересует то, что помогает тупому студенту-полудурку ваять ###, думая чуть меньше, чем его сосед.

Люди все разные. Кто-то умнее, кто-то глупее, к сожалению. Но факт есть факт, программирование уже индустрия, и С++ затачивался именно под индустриальные требования. А дальше уже остаётся давать слово деньгам. Деньги, как-то так получается, умнее всех. И они вкладывались в индустрию. Потому что одиночки сделают мало, по определению.

Автор: Earnest 10.10.2013, 13:59
Модератор: 
Друзья! Не надо засирать здешний заповедник относительной вежливости.
Тон, в котором ведет "дискуссию" o2n3e, абсолютно недопустим. 
Если есть что-то сказать автору топика по сути - прошу.
Но отвечать на такие выпады - себя не уважать. Просто игнорируйте.


Автор: o2n3e 10.10.2013, 18:45
Модератор: Сообщение скрыто.

Автор: o2n3e 10.10.2013, 18:54
Модератор: Сообщение скрыто.

Автор: akizelokro 11.10.2013, 07:22
Код

extern vector <tstring *> * your_comments;
extern vector <tstring *> * my_comments;


void holywar ()
{
  while(1)
  {
     // thread-safed block of discussion
     //...
     for ( size_t i = 0; i < your_comments->size(); i++)
     {
       tstring * ptstr = your_comments->at(i);
       tcout << *ptstr << std::endl;
       delete ptstr;
    }
    your_comments->clear();
    // ....
    // end of thread_safed block
    // thread-safed block of discussion again
    //...
    for ( size_t i = 0; i < my_comments->size(); i++)
    {
       tstring * ptstr = my_comments->at(i);
       tcout << *ptstr << std::endl;
       delete ptstr;
    }
    my_comments->clear();
    //...
  }
  // end of thread_safed block
}

Автор: bsa 11.10.2013, 11:46
Троллинг и хамство его стиль поведения (судя по форме общения типичный гопник). Его забанили везде, где могли.  smile 

http://www.linux.org.ru/people/o2n3e/profile
http://trinity-core.ru/members/o2n3e.4030/
http://amvnews.ru/index.php?go=Ratings&file=bycommauth&author=o2n3e


Автор: baldina 11.10.2013, 12:34
ну кому ж понравится ЧСВ прогрессирующий в ФГМ

Автор: o2n3e 11.10.2013, 20:04
Модератор: Сообщение скрыто.

Автор: akizelokro 12.10.2013, 07:13
Цитата(o2n3e @  11.10.2013,  20:04 Найти цитируемый пост)
Уже давно пора понять, что основная часть мира и любой остасли идиты, и то, что принимает большенство идиотов не может быть правдой и првильным путём по определению. Любое учение/дело тем ущербней, чем больше на него способны. И чем больше тел в нём - тем более оно бесполезно и ущербно. 


Экая новость что люди неодинаковы по своим интеллектуальным или физическим возможностям! Вот один наш спорщик помнит весь свой код, написанный с 95 года, это возможно, я верю, бывает всякое.  smile 
А вообще это уже начинается дискурс с уклоном в философию. Тогда как лучше всё перевести на деньги. Деньгам важен результат, а не твои или мои самомнения. Так что деньги пошли в ООП-концепцию, потому что был нужен индустриальный подход. А не протяжный вопль одиночества гения на скабрезном шарике заштатной космической планеты с достаточно испохабленной экологией и маловнятными общественными воззрениями расы насельников. Да и в космическом пространственно-временном континууме и вопль частного гения, и сама планета - малосущественные подробности для вселенского масштаба Универсума.

И оператор new/delete функционально даже не близко malloc/free. Потому что в общем случае может быть всё, что угодно.  smile

Добавлено @ 07:23
Крутой я, а не ты! smile  smile 

"Протяжный вопль" можно при желании на "истошный вопль",
"малозначительные подробности" на "призрак призрака, который снится призраку потом к утру в забытом сне"
 smile , и не нарушай мне торжественность времени и Вселенной, правда они малость тоже свихануты, но с этим я как-то разберусь  smile 

Автор: o2n3e 12.10.2013, 09:41
Модератор: Сообщение скрыто.

Автор: akizelokro 12.10.2013, 10:07
Цитата(o2n3e @  12.10.2013,  09:41 Найти цитируемый пост)
Ты хочешь со мной поспорить? Оператор new/delete "аллокатор" с такой же семантикой, как и malloc/free.


Хоп-ператор new/delete можно перегрузить. потом же есть placement new.
И, вообще, что хочу, то и наворочу. У меня более творческий ( развлекающийся) взгляд на мир, поэтому мне никто не указ.


Я - настоящий ЗЛОДЕЙ!  smile 

Автор: o2n3e 12.10.2013, 14:16
Модератор: Сообщение скрыто.

Автор: o2n3e 12.10.2013, 14:23
Модератор: Сообщение скрыто.

Автор: akizelokro 12.10.2013, 15:12
Цитата(o2n3e @  12.10.2013,  14:16 Найти цитируемый пост)
Творческий вгляд, никто не указ - это выбор наиболее мощного и фичастого ЯП, а такйо ЯП только один - сишка, вернее гнусишка. Творчество не совместимо с анальным рабством, в которое тебя вгоняет гнилой плюсовый обвес в виде стл, стандарта и прочего говна. Вобщем - не противоречь себе, признайся и исправся, либо не приписывай себе того, чего у тебя нет.


Успокоился?
new/delete в общем случае при перегрузке сможет делать всё что угодно, конструктора/деструктора в ООП показалось мало, так что для большего эффекта предусмотрели и этакие возможности.
Ты здесь попал в большую западню. Потому что тема по сути С/C++ (не стали прописывать подробней), так что ты смог бы столкнуться здесь с вопросами по С++, по С, по ObjectiveC (с классами) и так далее. 

И эта..
"Моё кунфу лучше" smile 


Автор: o2n3e 12.10.2013, 15:46
Модератор: Сообщение скрыто.

Автор: NoviceF 12.10.2013, 16:19
Цитата(o2n3e @  12.10.2013,  16:46 Найти цитируемый пост)
new/delete - это банальные имена функций, такие же как и malloc()/free(). И с ними тоже можно делать всё, что угодно.


Можно перегрузить malloc()/free() для конкретного класса?

Автор: akizelokro 12.10.2013, 16:59
Цитата(o2n3e @  12.10.2013,  15:46 Найти цитируемый пост)
ы что такое дно, а? new/delete - это банальные имена функций, такие же как и malloc()/free(). И с ними тоже можно делать всё, что угодно. Ничего не предусмотрели, глупое ты существо. Ну переделай мне new/delete в инкримент/дикремент - отвалится все, начиная от стл заканчивая твоими портянками. Ты несёшь тотальную херню.


Вообще-то есть глобальные new/delete. Если их переделать, то да, будет забавно. Если же перегрузить new/delete для моего произвольного класса, то тут ситуация несколько другая. 
И эта.. 
Пешши ищщо!

Добавлено через 2 минуты и 36 секунд
Цитата(o2n3e @  12.10.2013,  15:46 Найти цитируемый пост)
Твои познания матчасти на днище галимом, ты постоянно свичишь темы с матчасти на демагогию. Я тебе твой сосед по парте - для меня ты ### до тех пор, пока я не услышу от тебя вменяемых ответов. А уж жалкими попытками спорить со мной, при этом я сливаю тебя левой пяткой во всём - очень сильно показывают уровень твоего "кунгфу" балабола. Вперёд, только не со мной.


Давай поговорим о познаниях в матчасти. Чем ты из матаппарата владеешь нормально? (даже не буду шутить по поводу безталанной ругани и банального полукаламбура со словом "мат").

Добавлено через 4 минуты и 42 секунды
Цитата(o2n3e @  12.10.2013,  15:46 Найти цитируемый пост)
левой пяткой во всём


Когда-нибудь любой "аффтар" прокалывается и начинает говорить правду о себе.

Ладно, без шуточек. Рассказывай, что ты такого успешного написал?


Автор: o2n3e 12.10.2013, 17:11
Модератор: Сообщение скрыто.

Автор: o2n3e 12.10.2013, 17:14
Модератор: Сообщение скрыто.

Автор: akizelokro 12.10.2013, 17:22
Вопрос, ты чего такого успешного написал, если не секрет, на голом Сишнике? (такое сделать возможно, не спорю, так что ты сделал?)

Добавлено через 2 минуты и 13 секунд
Цитата(o2n3e @  12.10.2013,  17:11 Найти цитируемый пост)
Я буду писать, если ты перестанешь быть шутом. Мы уже поняли, что ты слился в ### и строить мне шута, аля "я дебил - мне можно нести херню, я играл с тобой, а ты купил - затрален лалка, ха-ха-ха". В школу.


"Я буду писать", "я не буду писать".. капризный ребёнок, однако.
Да не пиши, я чтоли тебя заставляю Хотя, могу и спровоцировать  smile 

Автор: o2n3e 12.10.2013, 18:24
Модератор: Сообщение скрыто.

Автор: akizelokro 12.10.2013, 18:42
Цитата(o2n3e @  12.10.2013,  18:24 Найти цитируемый пост)
Я виртуоз - я пишу код ради кода, не более. Мой код ценен не тем, что он делает( хотя делает он только полезные вещи) - а тем, как он это делает. Я пишу идеальный код на грани возможностей ЯП, железа и человека. Я не программист, не работаю программистом за еду, я не пишу ненужное ###. Я просто Царь сишки. В мейстриме этого мира все сложные вещи, которые возможно мне были бы интересны - нужны лишь для содержание немощей типа вас, поэтому нам не попути.


Понятно, старые понты.
Мне бы твои проблемки (я бы решил в в три раза быстрее и эффективнее). Ладно, трещи дальше.

Автор: o2n3e 12.10.2013, 22:30
Модератор: Сообщение скрыто.

Автор: akizelokro 13.10.2013, 07:36
Цитата(o2n3e @  12.10.2013,  22:30 Найти цитируемый пост)
И ты, уже слившись продолжаешь кукарекать и всё никак не прекратиш свои жалкие попытки поймать меня.


И обучаюсь я раза в два быстрее, чем ты.


Автор: o2n3e 14.10.2013, 16:08
Модератор: Сообщение скрыто.

Автор: akizelokro 14.10.2013, 16:10
Это что за белый шум?) smile 

Автор: o2n3e 15.10.2013, 14:42
Модератор: Сообщение скрыто.

Автор: EgoBrain 9.7.2014, 04:47
Добрый день!
Объясните пожалуйста что происходит, когда я вставляю выражение внутрь квадратных скобок оператора new?

Автор: Lukkoye 9.7.2014, 05:32
Код

auto* ptr = new type[  expression ];


Это - попытка выделить блок памяти размером минимум sizeof( type *expression ) байт.
(реальной памяти может быть выделено чуть больше, но не меньше, либо не выделено вообще).

В случае успеха, будет произведена попытка запуска конструкторов в количестве expression штук.
Таким образом будет создано expression штук объектов, каждый последующий следом за предыдущем и все - в этом не прерывном блоке.
(если конечно из конструкторов не полетят исключения, или что-то подобное не прервет процесс создания объектов).

Иными словами создается массив объектов, который размещается в куче.


Код


const size_t expression  = 10;

int array[expression ]; //<---- создали массив из 10 объектов типа int на стеке

auto* ptr = new int[  expression ]; //<---- создали массив из 10 объектов типа int в куче


Автор: EgoBrain 10.7.2014, 04:19
Lukkoye, спасибо за ответ. В итоге сам разобрался smile Все по логике.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)