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

[BCC32 Error] E2015, не получается проверить указатель перед удалением - C++

Восстановить пароль Регистрация
 
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
04.10.2012, 16:39     [BCC32 Error] E2015, не получается проверить указатель перед удалением #1
[BCC32 Error] Resource.cpp(43): E2015 Ambiguity between 'operator TGraphic::IStreamPersist *()' and 'operator TInterfacedPersistent::IInterface *()'

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

Что я не так делаю?

C++
1
2
3
4
5
6
7
void CMenu::UnloadResources(void)
{
  if (*pMenuPictures[0]!=NULL)
  {
    delete [] pMenuPictures;
  }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
04.10.2012, 17:57     [BCC32 Error] E2015, не получается проверить указатель перед удалением #2
C++
1
2
if (pMenuPictures)
    delete[ ] pMenuPictures;
Без всего кода более полный ответ дать проблематично.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.10.2012, 21:07     [BCC32 Error] E2015, не получается проверить указатель перед удалением #3
Цитата Сообщение от Deimon Посмотреть сообщение
if (*pMenuPictures[0]!=NULL)
* {
* * delete [] pMenuPictures;
* }
Этот код бессмыслен. Так как операция delete сама проверяет указатель, не равен ли он нулю.
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
05.10.2012, 07:45  [ТС]     [BCC32 Error] E2015, не получается проверить указатель перед удалением #4
Цитата Сообщение от Toshkarik Посмотреть сообщение
Этот код бессмыслен. Так как операция delete сама проверяет указатель, не равен ли он нулю.
А почему тогда он выдает ошибку "First chance exception at $7C812AFB. Exception class EAccessViolation with message 'Access violation at address 20FF4D1F in module 'BORLNDMM.DLL'. Read of address 00000000'. Process menu.exe (3596)" ? Именно в той самой строке с delete []
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2012, 08:10     [BCC32 Error] E2015, не получается проверить указатель перед удалением #5
Цитата Сообщение от Deimon Посмотреть сообщение
[BCC32 Error] Resource.cpp(43): E2015 Ambiguity between 'operator TGraphic::IStreamPersist *()' and 'operator TInterfacedPersistent::IInterface *()'
Тут разве речь об указателях? Неоднозначность перегруженных операторов.
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
05.10.2012, 08:19  [ТС]     [BCC32 Error] E2015, не получается проверить указатель перед удалением #6
Toshkarik , я почитал, и все понял что вы сказали, действительно, разницы нет. Но нужно присваивать нуль-указатель после удаления.
Но у меня вопрос примерно тот же. Вот два варианта кода:


C++
1
2
3
4
5
6
7
  
  //Вариант-1
  for (int i = 0; i < 7; i++)
  {
  delete pMenuPictures[i];
  pMenuPictures[i] = NULL;
  }
C++
1
2
3
4
5
6
7
  
  //Вариант-2
  delete [] pMenuPictures
  for (int i = 0; i < 7; i++)
  {
  pMenuPictures[i] = NULL;
  }
Весь рабочий код, чтобы было понятнее:
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
class CMenu
{
  private:
    GTB* pMenuPictures[7];
  public:
    CMenu();
    ~CMenu();
    int DrawAtBitmap(GTB* buffer, TPoint mouse_position); //код просто рисует на buffer, используя ресуры. Вызов метода закомментирован - не используется
    void LoadResources(void);
    void UnloadResources(void);
 
};
 
void CMenu::LoadResources(void)
{
  for (int i = 0; i < 7; i++)
  {
    pMenuPictures[i]= new GTB();
    pMenuPictures[i]->Transparent=true;
    pMenuPictures[i]->LoadFromFile("../Images/menu0"+IntToStr(i)+".bmp");
  }
}
 
CMenu::CMenu()
{
  LoadResources();
  UnloadResources();
  UnloadResources();//Это не ошибка, просто тест, чтобы обезопасить себя от "скрытых" подобных случаев.
  UnloadResources();
  UnloadResources();
}
CMenu::~CMenu()
{
  UnloadResources();
}
Вот вопрос, почему вариант 2 не работает, а вариант 1 работает как надо?
Размышление: Это может быть потому, что delete [] используется для удаления указателей такого рода - int* pIntPointer = new int[10]; ?

alsav22, да, вот мне и интересно как грамматически правильно надо написать то выражение. Потому что я ставил скобки по мере значимости операторов, но все равно не работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2012, 08:29     [BCC32 Error] E2015, не получается проверить указатель перед удалением
Еще ссылки по теме:

C++ [BCC32 Error] File1.cpp(74): E2285 Could not find a match for 'student1::student1(const char *,int,int)'
C++ Ошибка [BCC32 Error] E2453 Size of the type 'int[]' is unknown or zero
Как проверить на какой класс ссылается указатель? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
05.10.2012, 08:29     [BCC32 Error] E2015, не получается проверить указатель перед удалением #7
Вариант 2 неверный, потому что вы под массив указателей память не выделяли, а освобождаете. Память выделялась под каждый указатель, поэтому так и освобождать нужно, что и делается в варианте 1.
Yandex
Объявления
05.10.2012, 08:29     [BCC32 Error] E2015, не получается проверить указатель перед удалением
Ответ Создать тему
Опции темы

Текущее время: 21:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru