Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Segmentation fault 
:(
    Опции темы
ioManip
Дата 15.11.2014, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Вот такая штука выскакивает при отладке: Segmentation fault
Element.h
Код

class Element
{
public:  
  mutable int Delivery;
  mutable int Value;
  
  Element()
  {
    this->Delivery = 0;
    this->Value = 0;
  }
  
  static int findMinElement(int &a, int &b);
  void setDelivery(int a, int b);
};

Element.cpp
Код

int Element::findMinElement(int &a, int &b)
{
  if (a > b)
  {
      return b;
  }
  
  if (a == b)
  {
      return a;
  }
  else
  {
      return a;
  }
}

void Element::setDelivery(int a, int b)
{
  this->Delivery = Element::findMinElement(a, b);
}

main.cpp
Код

int main()
{
  int n, m;
  int i = 0;
  int j = 0;
  
  cout << "Введите количество поставщиков: ";
  cin >> n;
  
  int *arrayProducers = new int[n];
  
  cout << "Введите количество потребителей: ";
  cin >> m;
  
  int *arrayConsumers = new int[m];
  
  cout << endl;
  
  Element **arrayValue = new Element *[n];
  for (i = 0; i < n; i++)
  {
      arrayValue[i] = new Element[m];
  }
  
  //Заполняем запасы поставщиков
  for (i = 0; i < n; i++)
  {
      cout << "Введите запасы " << i + 1 << " поставшика: ";
      cin >> arrayProducers[i];
  }
  
  cout << endl;
  
  //Заполняем запасы потребителей
  for (j = 0; j < m; j++)
  {
      cout << "Введите запасы " << j + 1 << " потребителя: ";
      cin >> arrayConsumers[i];
  }
  
  cout << endl;
  
  //Заполняем массив стоимости
  for (i = 0; i < n; i++)
      for (j = 0; j < m; j++)
      {
          cout << "Стоимость перевозки от " << i + 1 << " поставщика к " << j + 1 << " потребителю: ";
          cin >> arrayValue[i][j].Value;
      }
  
//  for (i = 0; i < n; i++)
//  {
//      for (j = 0; j < m; j++)
//      {
//          cout << std::setw(3) << arrayValue[i][j].Value;
//      }
//      cout << endl;
//  }
  i = 0; j = 0;
  
  //Метод северо западного угла
  while ((i < n) && (j < m))
  {
      if (arrayProducers[i] == 0)
      {
          i++;
      }
      if (arrayConsumers[j] == 0)
      {
          j++;
      }
      if ((arrayProducers[i] == 0) && (arrayProducers == 0))
      {
          i++;
          j++;
      }
      
      arrayValue[i][j].setDelivery(arrayProducers[i], arrayConsumers[j]);
      arrayProducers[i] -= arrayValue[i][j].Delivery;
      arrayConsumers[i] -= arrayValue[i][j].Delivery;
  }
  
  for (i = 0; i < n; i++)
  {
      for (j = 0; j < m; j++)
      {
          cout << arrayValue[i][j].Value << "(" << arrayValue[i][j].Delivery << ")";   
      }
      cout << endl;
  }
  
  int resultFunction = 0;
  
  for (i = 0; i < n; i++)
  {
      for (j = 0; j < m; j++)
      {
          resultFunction += (arrayValue[i][j].Value * arrayValue[i][j].Delivery);
      }
  }
  
  cout << "Опорный план найден и равен: " << resultFunction << endl;
  
  return 0;
}


Сообщение об ошибке, выскакивает именно вот здесь:
Код

void Element::setDelivery(int a, int b)
{
  this->Delivery = Element::findMinElement(a, b);
}


Это сообщение отредактировал(а) ioManip - 15.11.2014, 11:47
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
tzirechnoy
Дата 15.11.2014, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
Сообщение об ошибке, выскакивает именно вот здесь:


Ну надо жэ! А у меня вот "main.cpp:7:3: error: 'cout' was not declared in this scope" ещё при компиляцыи. И это, надо сказать, гораздо более ожыдаемо для приведённого кода.

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

PS Ну и да, про "общаую бредовость" -- у Вас в основном цыкле поиска просто невозможная какая-то ахинея, у меня не очень получается дажэ представить, что это должно было быть. Но это всё неправильно.
PM MAIL   Вверх
ioManip
Дата 16.11.2014, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Цитата(tzirechnoy @  15.11.2014,  14:17 Найти цитируемый пост)
Ну надо жэ! 

Грубовато конечно, но ничего! А не работает у Вас потому что не хватает, вот этих строчек
Код

using std::cout;
using std::cin;
using std::endl;

Но Вы это и сами прекрасно знаете.


Цитата(tzirechnoy @  15.11.2014,  14:17 Найти цитируемый пост)
надо ещё пример правильного использования и входных данных,

Код

Введите количество поставщиков: 4
Введите количество потребителей: 5

Введите запасы 1 поставшика: 20
Введите запасы 2 поставшика: 130
Введите запасы 3 поставшика: 50
Введите запасы 4 поставшика: 90

Введите запасы 1 потребителя: 90
Введите запасы 2 потребителя: 40
Введите запасы 3 потребителя: 30
Введите запасы 4 потребителя: 60
Введите запасы 5 потребителя: 70

Стоимость перевозки от 1 поставщика к 1 потребителю: 3
Стоимость перевозки от 1 поставщика к 2 потребителю: 2
Стоимость перевозки от 1 поставщика к 3 потребителю: 1
Стоимость перевозки от 1 поставщика к 4 потребителю: 4
Стоимость перевозки от 1 поставщика к 5 потребителю: 3
Стоимость перевозки от 2 поставщика к 1 потребителю: 2
Стоимость перевозки от 2 поставщика к 2 потребителю: 4
Стоимость перевозки от 2 поставщика к 3 потребителю: 1
Стоимость перевозки от 2 поставщика к 4 потребителю: 2
Стоимость перевозки от 2 поставщика к 5 потребителю: 9
Стоимость перевозки от 3 поставщика к 1 потребителю: 8
Стоимость перевозки от 3 поставщика к 2 потребителю: 1
Стоимость перевозки от 3 поставщика к 3 потребителю: 3
Стоимость перевозки от 3 поставщика к 4 потребителю: 4
Стоимость перевозки от 3 поставщика к 5 потребителю: 7
Стоимость перевозки от 4 поставщика к 1 потребителю: 4
Стоимость перевозки от 4 поставщика к 2 потребителю: 3
Стоимость перевозки от 4 поставщика к 3 потребителю: 2
Стоимость перевозки от 4 поставщика к 4 потребителю: 1
Стоимость перевозки от 4 поставщика к 5 потребителю: 4

--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
feodorv
Дата 17.11.2014, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(ioManip @  15.11.2014,  11:41 Найти цитируемый пост)
for (j = 0; j < m; j++)
  {
      cout << "Введите запасы " << j + 1 << " потребителя: ";
      cin >> arrayConsumers[ i ];
  }


Добавлено через 8 минут и 18 секунд
А здесь вообще какое-то безрассудство:
Цитата(ioManip @  15.11.2014,  11:41 Найти цитируемый пост)
  while ((i < n) && (j < m))
  {
// пусть i стало n-1 или j стало m-1

      if (arrayProducers[i] == 0)
      {
// тогда i может стать n (выход за пределы массива)
          i++;
      }

      if (arrayConsumers[j] == 0)
      {
// тогда j может стать m (выход за пределы массива)
          j++;
      }

// В чем смысл сравнения arrayProducers == 0?
      if ((arrayProducers[i] == 0) && (arrayProducers == 0))
      {
// Аналогично - бесконтрольное увеличение значений индексов
          i++;
          j++;
      }
      
      arrayValue[i][j].setDelivery(arrayProducers[i], arrayConsumers[j]);
      arrayProducers[i] -= arrayValue[i][j].Delivery;
      arrayConsumers[i] -= arrayValue[i][j].Delivery;
  }




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
ioManip
Дата 17.11.2014, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 12.8.2011
Где: Благовещенск

Репутация: нет
Всего: нет



Цитата(feodorv @  17.11.2014,  00:54 Найти цитируемый пост)
А здесь вообще какое-то безрассудство

Охх и правда! Это уже моя невнимательность! Теперь понятно, почему так вспылил товарищ tzirechnoy. Там и правда бред был :(
Я вообще этот код с C# переводил...вот наверное и не туда глянул
Ну я поправил
main.cpp
Код

#include "Element.h"

using std::cout;
using std::cin;
using std::endl;

int main()
{
  int n, m;
  int i = 0;
  int j = 0;
  
  cout << "Введите количество поставщиков: ";
  cin >> n;
  
  int *arrayProducers = new int[n];
  
  cout << "Введите количество потребителей: ";
  cin >> m;
  
  int *arrayConsumers = new int[m];
  
  cout << endl;
  
  Element **arrayValue = new Element *[n];
  for (i = 0; i < n; i++)
  {
      arrayValue[i] = new Element[m];
  }
  
  //Заполняем запасы поставщиков
  for (i = 0; i < n; i++)
  {
      cout << "Введите запасы " << i + 1 << " поставшика: ";
      cin >> arrayProducers[i];
  }
  
  cout << endl;
  
  //Заполняем запасы потребителей
  for (j = 0; j < m; j++)
  {
      cout << "Введите запасы " << j + 1 << " потребителя: ";
      cin >> arrayConsumers[j];
  }
  
  cout << endl;
  
  //Заполняем массив стоимости
  for (i = 0; i < n; i++)
      for (j = 0; j < m; j++)
      {
          cout << "Стоимость перевозки от " << i + 1 << " поставщика к " << j + 1 << " потребителю: ";
          cin >> arrayValue[i][j].Value;
      }
  
//  for (i = 0; i < n; i++)
//  {
//      for (j = 0; j < m; j++)
//      {
//          cout << std::setw(3) << arrayValue[i][j].Value;
//      }
//      cout << endl;
//  }
  i = 0; j = 0;
  
  while (i < n && j < m)
  {
      if (arrayProducers[i] == 0)
      {
          i++;
      }
      if (arrayConsumers[j] == 0)
      {
          j++;
      }
      if (arrayProducers[i] == 0 && arrayConsumers[j] == 0)
      {
          i++;
          j++;
      }
      
      arrayValue[i][j].Delivery = Element::findMinElement(arrayProducers[i], arrayConsumers[j]);
      arrayProducers[i] = arrayProducers[i] - arrayValue[i][j].Delivery;
      arrayConsumers[j] = arrayConsumers[j] - arrayValue[i][j].Delivery;
  }
  
  for (i = 0; i < n; i++)
  {
      for (j = 0; j < m; j++)
      {
          cout << arrayValue[i][j].Value << "(" << arrayValue[i][j].Delivery << ")";   
      }
      cout << endl;
  }
  
  int resultFunction = 0;
  
  for (i = 0; i < n; i++)
  {
      for (j = 0; j < m; j++)
      {
          resultFunction += (arrayValue[i][j].Value * arrayValue[i][j].Delivery);
      }
  }
  
  cout << "Опорный план найден и равен: " << resultFunction << endl;
  
  return 0;
}

Element.cpp
Код


#include "Element.h"

int Element::findMinElement(int &a, int &b)
{
  if (a > b)
      return b;
  if (a == b)
  {
      return a;
  } else
      return a;
}

Element.h
Код


#ifndef ELEMENT_H
#define    ELEMENT_H

class Element
{
public:  
  int Delivery;
  int Value;
  
  static int findMinElement(int &a, int &b);
};

#endif    /* ELEMENT_H */

Но это штука так и продолжает меня терраризировать. В том же месте
Код

 arrayValue[i][j].Delivery = Element::findMinElement(arrayProducers[i], arrayConsumers[j]);



Это сообщение отредактировал(а) ioManip - 17.11.2014, 14:02
--------------------
Мечты не работают, пока ты не работаешь! 
PM MAIL Skype   Вверх
sQu1rr
Дата 17.11.2014, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Я вижу много new и ни одного delete - это вам не Java/C# - будет утечка памяти
Тут есть туториал http://www.learncpp.com/cpp-tutorial/69-dy...new-and-delete/

Это не решит выших проблем но есть над чем задуматься

Это сообщение отредактировал(а) sQu1rr - 17.11.2014, 14:08
PM MAIL Skype GTalk   Вверх
feodorv
Дата 17.11.2014, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(ioManip @  17.11.2014,  14:00 Найти цитируемый пост)
Там и правда бред был :(

Так ведь это осталось:
Цитата(feodorv @  17.11.2014,  00:54 Найти цитируемый пост)
// тогда i может стать n (выход за пределы массива)
Цитата(feodorv @  17.11.2014,  00:54 Найти цитируемый пост)
// тогда j может стать m (выход за пределы массива)
Цитата(feodorv @  17.11.2014,  00:54 Найти цитируемый пост)
// Аналогично - бесконтрольное увеличение значений индексов

Вы бы в начале цикла делали бы
Цитата(ioManip @  17.11.2014,  14:00 Найти цитируемый пост)
      arrayValue[i][j].Delivery = Element::findMinElement(arrayProducers[i], arrayConsumers[j]);
      arrayProducers[i] = arrayProducers[i] - arrayValue[i][j].Delivery;
      arrayConsumers[j] = arrayConsumers[j] - arrayValue[i][j].Delivery;

А изменения индексов - уже потом...


А здесь в чем смыл использования ссылок?
Цитата(ioManip @  17.11.2014,  14:00 Найти цитируемый пост)
int Element::findMinElement(int &a, int &b)



Вообще, меня гложут смутные сомнения, что индексы изменяться должны были бы по такому правилу:
Код

      if (arrayProducers[i] == 0 && arrayConsumers[j] == 0)
      {
          i++;
          j++;
      }
      else if (arrayProducers[i] == 0)
      {
          i++;
      }
      else if (arrayConsumers[j] == 0)
      {
          j++;
      }

а не как у Вас...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
xvr
Дата 17.11.2014, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(ioManip @  17.11.2014,  14:00 Найти цитируемый пост)
Код

  if (a == b)
  {
      return a;
  } else
      return a;

Долго смотрел, медитировал .... Видимо это новый способ жонглирования, или я что то не понял  smile 


PM MAIL   Вверх
tzirechnoy
Дата 17.11.2014, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
Вообще, меня гложут смутные сомнения, что индексы изменяться должны были бы по такому правилу:


Вряд ли всё так просто -- всё равно можно получить i>n-1 и j>n-1.

Цитата
Теперь понятно, почему так вспылил товарищ tzirechnoy.


Я не вспылил. В сети я всегда грубый и язвительный.

Мне очень лень копипастить пример, но, подозреваю, что от добавления Вашых трёх строчек изменится только номер строки с первой ошыбкой, и cout сменится на std::cout. А так -- будет ровно тот жэ несобираемый пример.

Вам всё-таки следует взять, создать проект из трёх файлов, собрать его и запустить перед тем, как постить. Это кажэтся сложным? Хорошый повод потренироваться, Вы ведь всё равно тренируетесь владеть C++. Или слишком простым? Так тем лучшэ, проделайте эти 5 действий, и Ваша совесть будет чиста.

Да, потом можно, конечно, ткнуть Вас непосредственно в то, что у Вас индэкс за границу массива выходит... Но по-моему это безсмысленное действие. Ну, то есть, я подозревал, что безсмысленное. Вон, товарищ fedorv ткнул -- и что, помогло это Вам? Вроде нет.

Потому у меня другое предложэние -- возьмите 3 листа A4. Возьмите карандаш. создайте на этом листе Вашы три массива (два одномерных и один двумерный), с измерениями, соответствующими Вашым входным данным. Кстати, данные можно взять поменьшэ -- по-моему, 1 2 3 4 5 6 7 вполне выдадут тот жэ самый segfaultный результат. Занесите начальные данные в массив (тут у Вас вроде всё вменяемо). И потом, вручную, просчитайте каждый шаг программы, записывая значения переменных.

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

Когда Вам будет казаться, что на бумаге всё прошло до конца и сделано правильно, а программа всё равно работает не так -- займитесь выводом журнала операцый (ну, банально, cerr << "I is: " << i ", J is: " << j << "\n";), и сверяйте в разных местах значения переменных и массивов в с тем, что Вы насчитали. Поскольку алгоритм вполне детэрминирован -- в какой-то момент будет первое различие, которое поможэт понять, в чём Вы ошыбались.


PM MAIL   Вверх
feodorv
Дата 17.11.2014, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(tzirechnoy @  17.11.2014,  18:04 Найти цитируемый пост)
Вряд ли всё так просто -- всё равно можно получить i>n-1 и j>n-1.

Это да. Но я предложил значимые операторы в теле цикла перенести в его начало, а все изменения индексов - в конец  smile 


Цитата(tzirechnoy @  17.11.2014,  18:04 Найти цитируемый пост)
займитесь выводом журнала операцый (ну, банально, cerr << "I is: " << i ", J is: " << j << "\n";)

ioManip, очень хороший совет, призываю прислушаться  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
sQu1rr
Дата 17.11.2014, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Зачем все так усложнять? Зачем нужны классы для такой простой задачи. Если вы изучаете классы, то выбрали неправильную задачу
Если я правильно понял задача сводится вот к этому:
Код

#include <iostream>
#include <random>
#include <vector>
#include <cmath>

using std::cout;

class Random {
    public:
        Random() : distr_(3, 10) {
            std::random_device rd;
            engine_.seed(rd());
        }

        template <typename T>
        void operator >> (T& n) {
            n = distr_(engine_);
            cout << n << std::endl;
        }

    private:
        std::uniform_int_distribution<int> distr_;
        std::default_random_engine engine_;
};

Random cin;

int main() {
    int n, m, left = 0;

    cout << "Enter the number of suppliers: ";
    cin >> n;

    cout << "Enter the number of clients: ";
    cin >> m;

    std::vector<int> suppliers(n);
    std::vector<int> clients(m);
    std::vector<std::vector<int>> cost(n, std::vector<int>(m));

    for (int i = 0; i < n; ++i) {
        cout << "Enter supplier #" << i + 1 << " stock: ";
        cin >> suppliers[i];
        left += suppliers[i];
    }

    for (int i = 0; i < m; ++i) {
        cout << "Enter client #" << i + 1  << " capacity: ";
        cin >> clients[i];
        left -= clients[i];
    }

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cout << "Cost of delivery to client #" << j + 1 << " ";
            cout << "for supplier #" << i + 1 << ": ";
            cin >> cost[i][j];
        }
    }

    int i = 0, j = 0, r = 0;
    while (i < n && j < m) {
        if (!suppliers[i]) ++i;
        else if (!clients[j]) ++j;
        else {
            int a = std::min(suppliers[i], clients[j]);
            suppliers[i] -= a;
            clients[j] -= a;
            r += a * cost[i][j];
        }
    }

    cout << "Total cost: " << r << std::endl;
    cout << "Undelivered: " << std::max(left, 0) << std::endl;
}

А ваш код вводит в заблуждение (запасы клиента) - какие у него могут быть запасы, если ему что-то доставляют, а потом отнимают от "его запасов". Наверное это все же "вместительность клиента"
PM MAIL Skype GTalk   Вверх
sQu1rr
Дата 17.11.2014, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



А segmentation fault у вас изза сдед. строчек кода:
Код

for (j = 0; j < m; j++)
{
    cout << "Введите запасы " << j + 1 << " потребителя: ";
    cin >> arrayConsumers[i];
}

Тут вы уже исправились

Код

  while ((i < n) && (j < m))
  {
      if (arrayProducers[i] == 0)
      {
          i++;
      }
      if (arrayConsumers[j] == 0)
      {
          j++;
      }
      if ((arrayProducers[i] == 0) && (arrayProducers == 0))
      {
          i++;
          j++;
      }
      
      arrayValue[i][j].setDelivery(arrayProducers[i], arrayConsumers[j]);
      arrayProducers[i] -= arrayValue[i][j].Delivery;
      arrayConsumers[i] -= arrayValue[i][j].Delivery;
  }

А вот тут нет, во первых, индексы выходят за предел (вам об этом уже говорили), а во вторых, опять i вместо j, но опять же уже исправили
Должно быть так:
Код

if (arrayProducers[i] == 0) {
    i++;
} else if (arrayConsumers[j] == 0) {
    j++;
} else {
    arrayValue[i][j].setDelivery(arrayProducers[i], arrayConsumers[j]);
    arrayProducers[i] -= arrayValue[i][j].Delivery;
    arrayConsumers[j] -= arrayValue[i][j].Delivery;
}


И как я указал выше вы не освобождаете пямять которую выделяете операторами new!

Это сообщение отредактировал(а) sQu1rr - 17.11.2014, 22:20
PM MAIL Skype GTalk   Вверх
tzirechnoy
Дата 18.11.2014, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 2
Всего: 16



Цитата
И как я указал выше вы не освобождаете пямять которую выделяете операторами new!


Кстати, не самое осмысленное занятие в данном примере. Надо заметить, что текущая память в приложэниях, которые работают неделями -- бесит, но манера всякого объектного кода вызывать мильон деструкторов и деаллокаторов минуту работы HDD там, где достаточно _abort() -- бесит не менее.
PM MAIL   Вверх
sQu1rr
Дата 18.11.2014, 04:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 3
Всего: 13



Цитата(tzirechnoy @  17.11.2014,  23:54 Найти цитируемый пост)
Кстати, не самое осмысленное занятие в данном примере

Так любой пример на этом сайте не достоин освобождению памяти в таком случае. На мой взгляд - освобождение - хорошая привычка, и лучше ставить delete везде где можно пропустить, будучи увереным что ОС все подчистит, чем пропустить там где это будет дорого стоить. Тем более это must если проект в будущем будет усовершенствоваться, или будет использоваться как библиотека.


Цитата(tzirechnoy @  17.11.2014,  23:54 Найти цитируемый пост)
манера всякого объектного кода вызывать мильон деструкторов и деаллокаторов минуту работы HDD там, где достаточно _abort() -- бесит не менее. 

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

Да и вообще, что вы советуете человеку который явно не очень давно начал изучать язык? smile
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.