Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2019, 13:26   #21
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну тема же о том, что
Что совсем не похоже на ситуацию, в которой есть смысл использовать обычный массив вместо вектора.
А с ним и вопросы про размер отпадут.
1.
вот к чему ты сейчас это написал?

тебе не кажется, что вот это твое сообщение
не имеет никакой логической связи с предыдущими?

у нас из-за этого что ли будут большие проблемы,
если мы напрямки new/delete заюзаем?

2.
вот ты привел цитату человека.
ты сам читал его сообщение?
ты понял, что хотел сказать,
и о чем хотел спросить человек?


человек обратил внимание,
что delete[] каким то образом сама определяет количество элементов.
и вот у него возникло два вопроса:
как это делает delete[],
и можно ли ему тоже как то получить доступ к этой информации.

и вот нафига ты сейчас приплел контейнеры,
которые в контексте темы вообще никак не фигурируют?


такое впечатление, что ты вообще не вникаешь в суть написанного.
и отвечаешь невпопад.
_Bers вне форума Ответить с цитированием
Старый 05.06.2019, 13:38   #22
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну так на исходный вопрос сразу ответили, а потом просто подсказали, что в С++ как правило лучше использовать стандартные контейнеры.

Но да, формулировка про большие проблемы и внезапный переход к этому от скорости — не очень.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.06.2019, 16:02   #23
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
это что по твоему?
Это выделение памяти.
Массив вы создадите, но передать его никуда не сможете.

Цитата:
Сообщение от _Bers Посмотреть сообщение
объяснить причину ты конечно не сможешь?
Цитата:
Сообщение от _Bers Посмотреть сообщение
ежели new/delete поюзать,
то обязательно возникнут большие проблемы
Обязательно может и не возникнут но вероятность гораздо больше.
Я насмотрелся на утечки памяти, юзайте new/delete напрямую, а я уж лучше через смарт.

Цитата:
Сообщение от Dekay Посмотреть сообщение
Вы сначала говорите, что скорость прежде всего
Так надо думать, что делать. Можно сделать и так, чтоб уменьшения скорости (overhead) не было совсем. Если например будете все время передавать std::vector по значению то будет ой-ой. А если передавать просто указатель и размер всегда вместе, то никакой разницы не будет, от слова совсем.

Цитата:
Сообщение от _Bers Посмотреть сообщение
вот нафига ты сейчас приплел контейнеры,
Потому что контейнеры обеспечивают документированный способ получать размер массива. new/malloc документировано такой информации не дают
waleri вне форума Ответить с цитированием
Старый 05.06.2019, 20:59   #24
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Я насмотрелся на утечки памяти
да утечки ладно, не жалко.
Я вот недавно в одном проекте любителя new/delete (с вроде как кучей лет опыта, хотя вроде больше по С) постоянно натыкался на креши из-за повторных delete, выходов за пределы переиспользуемого в разных местах массива и прочей фигни.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.06.2019, 16:51   #25
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Это выделение памяти.
Массив вы создадите, но передать его никуда не сможете.
а выше ты писал:

Цитата:
Сообщение от waleri Посмотреть сообщение
Строго говоря, в С/С++ нет массивов
то бишь, ты пишешь, что я создаю массив, но массивов в с/с++ нет?
ты осознаешь насколько долбанутый бред у тебя получается?

ты определись: так массивы в с/с++ существуют, или нет?

вот это что за бред ты несешь?
Цитата:
Сообщение от waleri Посмотреть сообщение
Квадратные скобки это скорее выделение памяти.
что значит слово "скорее" ?
ты что тут гаданием что ли занимаешься?
не нужны никакие домыслы.
просто открой учебник и почитай,
что означает синтаксис

и что значит "но передать его никуда не сможете"?
массив можно передать по значению, как поле структуры.
либо передать как указатель на первый элемент.
либо по ссылке.

https://rextester.com/VROT93625

Код:
#include <iostream>
#include <type_traits>

#include <typeinfo>
#include <cassert>
#include <string>

#if defined(__GNUC__) || defined(__MINGW32__) || defined(__MINGW__)
    
    #include <cxxabi.h>
    #include <cstdlib>
    
    inline std::string demangle(const char* name)
    {
        struct storage
        {
            char* p;
            explicit storage(char* ptr) noexcept 
                : p(ptr) 
            {}
            ~storage() { std::free(p); }
            
            storage(const storage&)            = delete;
            storage& operator=(const storage&) = delete;
        };
        
        assert(name);
        int status = -4; 
        const storage result {abi::__cxa_demangle(name, 0, 0, &status) };
        return (status == 0) ? result.p : name;
    }        
#else
    inline ::std::string demangle(const char* name) 
    { 
        assert(name);
        return name; 
    }
#endif

template<typename T> void array_type(T&& arr)
{
    std::cout << "type = '" << demangle(typeid(arr).name()) << "'\n";
}

auto indent(const size_t deep = 0)
{
    return std::string(deep * 2, ' '); 
}

template<class T, size_t X>
void view_array(const T (&array)[X], const size_t deep = 0)
{
    std::cout << indent(deep) << "{";
    for(size_t x = 0; x != X - 1; ++x)
        std::cout << array[x] << ", ";
    std::cout << array[X - 1];
    std::cout << "}\n";
}


template<class T, size_t Y, size_t X>
void view_array(const T (&matrix)[Y][X], const size_t deep = 0)
{
    const auto indent1 = indent(deep);
    std::cout << indent1 << "{\n";
    for(const auto& arr: matrix)
        view_array(arr, deep + 1);
    std::cout << indent1 << "}\n";
}


int main()
{
    const int arr[3] = {1,2,3};
    
    const int matrix[3][4] = 
    {
        {1,2,3,4},
        {5,6,7,8},
        {9,1,2,3},            
    };
    
    const int cube[2][3][3] = 
    {
        {
            {1,2,3},
            {4,5,6},
            {7,8,9},            
        },
        {
            {1,2,3},
            {4,5,6},
            {7,8,9},            
        },
    };
    
    array_type(arr);
    view_array(arr);
    
    array_type(matrix);
    view_array(matrix);
    
    array_type(cube);
    view_array(cube);
}

вывод в консоль:
Код:
type = 'int [3]'
{1, 2, 3}
type = 'int [3][4]'
{
  {1, 2, 3, 4}
  {5, 6, 7, 8}
  {9, 1, 2, 3}
}
type = 'int [2][3][3]'
{
  {
    {1, 2, 3}
    {4, 5, 6}
    {7, 8, 9}
  }
  {
    {1, 2, 3}
    {4, 5, 6}
    {7, 8, 9}
  }
}
как видишь - все у меня прекрасно получается.

Цитата:
Сообщение от waleri Посмотреть сообщение
Обязательно может и не возникнут но вероятность гораздо больше.
но ты же написал, что не просто могут возникнуть,
а уже и при том - большие.

ты собственный текст то читал?
Цитата:
Сообщение от waleri Посмотреть сообщение
Если вы пишете на С++ и используете напрямую new, delete и * то значит у вас (большие) проблемы.
а теперь выясняется, что ты не о самих проблемах,
а лишь о вероятности их появления?
проблем оказывается вообще может и не быть?

видишь как сильно начинают меняться показания,
когда приходится не только писать,
но ещё и думать о чем пишешь.

вот ты пишешь: "но вероятность гораздо больше".
больше чем что?
если тезис использует сравнение,
то обязательно нужно декларировать с чем именно производится это сравнение.
а иначе тезис получается глупым.
фиг знает, что там у автора было в голове.

например это можно понять, как:
при использовании new/delete вероятность возникновения проблем больше,
чем в случае не использования онных в коде.

ну да. вот у одного парня никогда не было девушки.
соответственно, и проблем, связанных с девушками у него тоже нет и никогда не было.
это как бе капитанская очевидность.

и что?
не иметь дел с девушками что ли теперь?

Цитата:
Сообщение от waleri Посмотреть сообщение
Я насмотрелся на утечки памяти, юзайте new/delete напрямую, а я уж лучше через смарт.
а я вот за всю свою жизнь ни разу вообще ни в каком проекте
не сталкивался с проблемой утечек памяти.

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

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

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

а ты пишешь про большие проблемы.
про то, что ты уже насмотрелся на эти ужасы.

ты пишешь это так, словно сыт утечками по горло!

мне сложно даже представить что такого ты мог "насмотреть"
твой взгляд на вещи противоречит здравому смыслу.


Цитата:
Сообщение от waleri Посмотреть сообщение
Потому что контейнеры обеспечивают документированный способ получать размер массива. new/malloc документировано такой информации не дают
Человек задал вопрос конкретно насчет delete[]

И вот нафига было преплетать контейнеры,
которые не имеют к delete[] ни малейшего отношения?

я афигиеваю с людей.
вы вообще думаете о том, чято пишите/читаете?

- который час?
- вам обязательно нужны контейнеры! если у вас нет контейнеров - у вас большие проблемы!
- лять, вот нахрена мне ваши контейнеры, если я спросил который час?????
- у нас нет документации на часы, зато есть документированный способ получить размер массива....
_Bers вне форума Ответить с цитированием
Старый 06.06.2019, 17:19   #26
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
просто открой учебник и почитай,
стандарт тогда уж, мало ли кто там что в учебниках написать решил.


Цитата:
Сообщение от _Bers Посмотреть сообщение
И вот нафига было преплетать контейнеры,
которые не имеют к delete[] ни малейшего отношения?
чтобы человек задумался о том, что возможно он не в том направлении идет и есть способы проще.

А про delete[] ответили сразу, так что аналогия опять неудачная.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 06.06.2019, 17:23   #27
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
ты определись: так массивы в с/с++ существуют, или нет?
_Bers, я как человек очень далёкий и от C и от C++ хотел бы спросить Вас.
в рамках исходного вопроса:
Цитата:
Сообщение от Arigato Посмотреть сообщение
Возник вот какой вопрос. Допустим, пользователь задает число элементов и мы создаем массив динамически:
Код:
int n;
cin>>n;
<тут создание целочисленного динамического массива a на n элементов>
как должны объявляться динамические массивы, чтобы с ними можно было работать без передачи размера n ?
вывести их содержимое на экран, например.
Вы могли бы изменить свой пример для иллюстрации?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.06.2019, 01:47   #28
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
либо передать как указатель на первый элемент.
Курсив мой, для меня тема закрыта - массив не есть указатель.
Если будем считать указатели массивами, тогда массивы есть и в ассемблере.
Пользуйтесь new/delete на здоровье, мне фиолетово. Если можете написать что-то сложнее hello world и ни разу не допустить ошибок с памятью - флаг вам в руки.
И не надо городить мне кучу кода - С++ я знаю не хуже вас, если не лучше.

Цитата:
Сообщение от _Bers Посмотреть сообщение
ты пишешь это так, словно сыт утечками по горло!
Да, потому что я задолбался их искать и править.
Поработайте с проектом в 20К файлов и поговорим опять.


Цитата:
Сообщение от _Bers Посмотреть сообщение
И вот нафига было преплетать контейнеры,
Во первых, на вопрос был дан ответ.
Во вторых, контейнеры приплел не я, читайте тему внимательно. Тем не менее, если требуется знать размер выделенной памяти я полностью поддерживаю данную рекомендацию.
Цитата:
Сообщение от _Bers Посмотреть сообщение
либо утечки есть, но слишком незаметные,
Когда комп поработает пол-года это становиться заметным - вот подите и найдите такие утечки.
waleri вне форума Ответить с цитированием
Старый 07.06.2019, 11:04   #29
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Если можете написать что-то сложнее hello world и ни разу не допустить ошибок с памятью
Так он как раз и говорил, что надо выбирать инструменты в зависимости от ситуации, а не тупо всегда топить за что-то одно.

Но конечно я считаю, что в С++ "по умолчанию" надо брать контейнеры, смарт указатели и т.д., а на new/delete переходить только если есть какие-то веские причины для этого.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.06.2019, 12:19   #30
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
_Bers, я как человек очень далёкий и от C и от C++ хотел бы спросить Вас.
в рамках исходного вопроса:

как должны объявляться динамические массивы, чтобы с ними можно было работать без передачи размера n ?
вывести их содержимое на экран, например.
Вы могли бы изменить свой пример для иллюстрации?
В языке с++ не существует никаких "динамических массивов"
Существуют "массивы данных" которые можно аллоцировать в куче.
Существуют высокоуровневые "контейнеры" - особые типы данных,
которые предоставляют удобства цивилизации и надежную работу.

https://rextester.com/GDOAM4087

Код:
#include <iostream>
#include <vector>

template<class stream>
bool check_stream(stream&& obj, const char* name) noexcept
{
    if(obj)
        return true;
    
    std::cerr<< name << 
        " The stream is corrupted. "
        "The process may have been started with input redirection I/O "
        "with incorrect data source/receiver"
    ;
    return false;
}

template<class stream>
bool check_stream(stream&& obj) noexcept
{
    if(obj)
        return true;
    
    std::cerr<< "invalid input data --> exit from programm\n";
    return false;
}


int main()
{
    if(!check_stream(std::cin, "'std::cin'"))
        return 1;
    if(!check_stream(std::cin, "'std::cout'"))
        return 1;
    if(!check_stream(std::cin, "'std::cerr'"))
        return 1;

    std::cout << "enter number of array: ";
    size_t n = 0;    
    std::cin >> n;
    
    if(!check_stream(std::cin))
        return 1;
    
    //<тут создание целочисленного динамического массива a на n элементов>    
    std::vector<int> myvec;
    myvec.reserve(n);
    for(size_t i = 0; i != n; ++i)
    {
        std::cout << "\nenter element: ";
        int val = 0;
        std::cin >> val;
        if(!check_stream(std::cin))
            return 1;
        myvec.emplace_back(val);
    }

    std::cout << "\ndata: ";
    for(const auto& el: myvec)
        std::cout << el << ", ";
    std::cout << '\n';    
}
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как освободить память от типа Audio? reyn90 Общие вопросы .NET 6 26.12.2015 23:21
Освободить память формы st_yak C++ Builder 0 21.12.2013 19:56
Проверить выделена ли память под объект Sibedir Общие вопросы Delphi 58 21.03.2011 11:48
Освободить память от CEdit Eros Общие вопросы C/C++ 0 29.11.2010 15:37
Неправильно выделена память. С++ Purr Помощь студентам 7 31.10.2010 20:05