Форум программистов, компьютерный форум CyberForum.ru

delete[] статической памяти - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Морской бой http://www.cyberforum.ru/cpp-beginners/thread868908.html
Нужна игра Морской бой. Месяц провалялся в больнице, ничего не выучил, а курсач горит. Надеюсь на ваше понимание:)
C++ Ссылка на неразрешенный внешний символ Приветствую. Проблема - при компиляции появляется ошибка вида: error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl std::main(void)" (?main@std@@YAHXZ) в функции "unsigned long __stdcall std::StartMain(void *)" (?StartMain@std@@YGKPAX@Z) void CALLBACK resize (int width,int height) //инициализация функции вызываемой при изменении размеров окна {glViewport (0,0,width, height); ... http://www.cyberforum.ru/cpp-beginners/thread868889.html
Нужно рассчитать квартплату для домов C++
Дано 2 класса - класс домов и класс улиц. Класс улиц является контейнерным (массив). Мне надо добавить расчет квартплаты для каждого дома на улице (или для всех домов на улице) в основную функцию.. Т.е. Сначала выбираем улицу затем выбираем дом из предложенных (или только улицу) и расчитываем.. Не получается это реализовать Главная функция: #include "stdafx.h" #include "Home.h" #include...
подскажите пожалста где ошибка , проверел вручную не сходитса, T0 (x) =1; T1(x) = x; Tn (x) = 2x *T(n-1)(x) -T(n-2) (x) C++
#include<iostream> #include<fstream> using namespace std; double a=2.0,b=-1.0; double*p,*q; void null_ar(double*a,int n) {for(int i=0;i<n;a=0);} void main() { int n;cout<<"n=";cin>>n;
C++ .h и .cpp файлы, бредовые ошибки после разбиения класса http://www.cyberforum.ru/cpp-beginners/thread868867.html
Какая то проблема со string Во всех функциях в файле реализации одна ошибка: Несоответствие списка аргументов, отсутствуют экземпляры В чем хотя бы ошибка? В коде или что то с компилятором? Может неправильно инклуды написал? class Material { public: string name; unsigned count; double price_one,
C++ Не копируется структура C++ (по введеному номеру телефона удалить информацию из файла) Рабочий код: Структура в заголовочном файле: struct contact{ int ID; std::string Name; std::string Surname; std::string Midlename; int IDgroup; birthday Birthday; int age; подробнее

Показать сообщение отдельно
Убежденный
Системный программист
Эксперт С++
15173 / 6805 / 1073
Регистрация: 02.05.2013
Сообщений: 11,121
Завершенные тесты: 1
20.05.2013, 21:29     delete[] статической памяти
Давайте вернемся к тому, с чего начали.

Цитата Сообщение от faridenco Посмотреть сообщение
1. Должна ли возникать ошибка (или падение программы) при применении delete[] к статической памяти?
Согласно стандарту, не должна. Но указывается, что в этом случае поведение не определено.
То есть, в зависимости от комбинации "компилятор-платформа" и других факторов, может
возникнуть все, что угодно - от "замалчивания", которое наблюдается на VC++ 2005, до
выбрасывания исключений и порчи данных.

Добавлю, что delete-выражение корректно только тогда, когда ему передается не только
правильное значение указателя, но и его тип:

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
33
34
35
36
37
38
#include <iostream>
 
 
 
class foo
{
public:
    foo()
    {
        std::cout << "create" << std::endl;
    }
 
    ~foo()
    {
        std::cout << "destroy" << std::endl;
    }
};
 
 
 
foo *create_foo()
{
    return (new foo());
}
 
void destroy_foo(void *pFoo)
{
    delete pFoo;
}
 
 
 
int main()
{
    foo *pFoo = create_foo();
    destroy_foo(pFoo);
    return 0;
}
Вывод данной программы (VC++ 2012):
> create
Как видим, деструктор foo не был вызван.
Кстати, не удивляйтесь, если на каком-то компиляторе эта программа завершится с ошибкой
или повиснет, так как это тоже undefined behavior.

И я могу объяснить, почему Стандартом здесь не предусмотрен выброс какого-нибудь исключения,
что было бы благом. Причина - оптимизация. Указатели хранят лишь адрес ячейки памяти, без
информации о типах и тому подобного. Подразумевается, что программист сам следит за
правильным удалением объектов и "не платит за то, что не использует".

Цитата Сообщение от faridenco Посмотреть сообщение
2. Если вылетание при delete[] статической памяти возможно, то как узнать какой указатель: на динамическую память или статическую.
Никак.
Этот вопрос решается на другом уровне - "политика владения".
Обычно на уровне всего исходного кода проекта поддерживается ряд ограничений по поводу
того, какие функции могут создавать и удалять объекты, а какие нет.
Например, функция, принимающая указатель, обычно не освобождает его, оставляя это на
совести вызывающего кода. Это один из простейших паттернов владения объектами.
Кроме этого, вместо "голых" указателей надежнее применять смарт-поинтеры и программные
интерфейсы, самостоятельно реализующие управление временем жизни объектов. Например,
подсчет ссылок. Это очень распостраненный подход на C++, где есть такие вещи, как RAII.
Количество ошибок, связанных с управлением памятью, при таком подходе сильно снижается.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru