[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Ребят, у меня тут несколько тупая проблема.
    Предположим некий код:
    Code:
    ...
    p = new double [n];
    T = new double [n];
    ...
    delete [] p;
    delete [] T;
    
    На участке после выделения памяти она вся используется.
    При трассировке на команде delete [] T; вылетает следующий эксепшн:
    HEAP[prog.exe]: Heap block at 00365EE8 modified at 00365F34 past requested size of 44
    Windows has triggered a breakpoint in prog.exe.

    Я может быть конечно где-то лажанул, но что-то не понимаю в какую сторону вообще копать. Хелп!
     
  2. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    iv.
    Так сложно сказать - всё вроде верно. Приведи полный сорц - посмотрим. А так много чего может быть, на мой любительский взгляд конечно :)
     
  3. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Проблему решил, подзабыл адресную арифметику. =)
    А ошибка в общем-то и говорила, что вышел за пределы выделенной памяти.
     
  4. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Это снова я.
    Как вызвать перегруженый оператор delete?
    Перегружал так: void operator delete(void *p, char *fileName, int lineNumber)
     
  5. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Ну и вызывай по своим параметрам... А вообще, я так понял, твой delete не имеет никакого смыслового отношения к настоящему delete, поэтому лучше назови его по другому...
     
  6. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    o_O

    Назвать оператор по другому? o_O o_O
     
  7. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    kez, я может не верно выразился... Я имел в виду, что при той реализации, что он хочет лучше реализовать это как обычную функцию... Параметры того оператора, что он хочет реализовать повергают в шок...
     
  8. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Ну да... А я уж подумал ты решил создать свой оператор...
     
  9. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Господа, мне нужен именно перегруженный delete, ибо работаю с памятью по-своему.
    А операторы new и delete имеют обыкновение вызывать конструкторы и деструкторы объектов. Даже при перегрузке.
    Просто new я перегрузил похожим образом и вызывается он примерно так:
    Code:
    DWORD* mem = new(__FILE__, __LINE__) DWORD
    Следующая хитрость позволяет его вызывать вообще как стандартный:
    Code:
    #define new new(__FILE__, __LINE__)
    Так вот с delete так не прокатывает почему-то.

    ПС: перегружать с тем же набором параметров мешает то, что эти операторы у меня сидят в dll и при экспорте компилятор ругается. =\

    В общем-то, набор параметров на самом деле особого значения не имеет.
     
  10. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Code:
    
    void* __cdecl operator new( size_t s )
    {
            OutputDebugString("Trace: new");
    	return lmalloc( s );
    }
    
    void __cdecl operator delete( void *p )
    {
            OutputDebugString("Trace: delete");
    	lfree( p );
    }
    
    
     
    1 person likes this.
  11. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    ААААА, кез, чмокаю тя в носик!!! Выручил.
    Я почему-то когда делал __declspec(dllexport) void* operator new(size_t size) компилятор ругался..
     
  12. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    :eek: :eek: :eek: :eek: Как можно экспортировать оператор?
     
  13. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Эммм, ну __declspec(dllexport) void* operator new(size_t size, DWORD pim, DWORD piu) вполне прокатило и даже работало =)
     
  14. ZaCo

    ZaCo Banned

    Joined:
    20 Jun 2005
    Messages:
    737
    Likes Received:
    336
    Reputations:
    215
    >>Как можно экспортировать оператор?

    ну в конечном счете любой перегруженный оператор является функцией, другое дело что не совсем очевидно какое имя будет генерировать компилятор при экспорте..
     
    1 person likes this.
  15. Murena

    Murena Member

    Joined:
    17 Aug 2007
    Messages:
    14
    Likes Received:
    8
    Reputations:
    0
    с клавы вводиться предложение. Надо в нем найти определенное слово и заменить его другим. как?
     
  16. EST a1ien

    EST a1ien Elder - Старейшина

    Joined:
    2 Apr 2006
    Messages:
    249
    Likes Received:
    48
    Reputations:
    16
    Народ помогите разобраться с этим кодом уже 2 часа с ним парюсь. (всякая ненужная фигня вырезанна)
    Code:
    int main(int argc, char* argv[])
    {	
    	
    	char com[80];
    	while(1)
    	{
    		cout<<"# ";
    		gets(com);
    		int iret=command(com);
    		if (iret==2) break;
    	cout<<"\n\n";
    	}
    	return 0;
    }
    
    int command(char *s)
    {
    char * pch;
    	 pch = strtok (s," ");
      while (pch != NULL)
      {
      	if(!strcmp("-add",pch))
    		{
    		pch = strtok (NULL, " ");
    		if (pch)
    		{
    		if (!strcmp("s",pch)) 
    		{
    			pch = strtok (NULL, " ");
    			add_stud(pch);
    			break;
    		}
    		}
    		cout<<"To get help about command put -help add";
    		return 1;
    		}
    	if(!strcmp("-exit",pch) || !strcmp("-quit",pch))
    		{
    		cout<<"Good Buy\n";
    		return 2;
    		}
    	  pch = strtok (NULL, " ");
      }
      cout<<"Command is not supported! Put -help to get Help";
    return 0;
    }
    
    int add_stud(char *n)
    {
    char t[80];
    		int i5Valu[5];
    	cout<<"EnterFIO\n";
    	cin>>t;
    	cout<<"Enter 5 Values\n";
    	return 1;
    }
    дело в том что если мы вводим
    Code:
    -add s 1
    Вместо 1 может быть что угодно суть не в этом.
    То на экране появляется запрос на ввод FIO
    НО когда мы вводим фио и нажимаем ентер то у нас появляются 2 лишние строки с сообщением
    Code:
    Command is not supported! Put -help to get Help
    Откуда????? они там берутся не как немогу догнать.

    Вот что выводиться на экран.

    Code:
    # -add s 1
    EnterFIO
    asdsad
    Enter 5 Values
    Command is not supported! Put -help to get Help
    
    # Command is not supported! Put -help to get Help
    
    #
     
  17. Ky3bMu4

    Ky3bMu4 Elder - Старейшина

    Joined:
    3 Feb 2007
    Messages:
    487
    Likes Received:
    284
    Reputations:
    42
    In fuction int command(char *s) :
    Code:
    while (pch != NULL)
    {
    ...................................
    if (!strcmp("s",pch)) 
    {
    pch = strtok (NULL, " ");
    add_stud(pch);
    [B]break;[/B]
    ....................................
    }
    
    Обрати внимание на break; , он делает выход из твоего цикла while (pch != NULL), а в конце цикла что?
    Code:
    cout<<"Command is not supported! Put -help to get Help";
    return 0;
    
    Сделай вместо break return -1 и всё вроде должно быть норм. :)
     
    1 person likes this.
  18. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Нельзя менять число аргументов при перегрузке оператора.

    Скажу сразу - очень извратное ;)
     
    #538 _Great_, 27 Dec 2007
    Last edited: 27 Dec 2007
    1 person likes this.
  19. Neovild

    Neovild Elder - Старейшина

    Joined:
    18 Dec 2007
    Messages:
    28
    Likes Received:
    22
    Reputations:
    0
    Сейчас на С перехожу. Написал самое простое что есть- Стек написал (не думайте что я в алгоритмах не шарю, кучи Фибоначчи, 3х связные списки и т.д. потом) посмотрите на сами указатели, просто думаю a- массив, int *p=a -коряво или нет?
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    void Add(int *a[], int *kol, int el);
    int Del(int *a[], int *kol);
    void Display(int *a[], int *kol);
    
    void Add(int *a[], int *kol, int el)
    {
         int *p=a;
         ++(*kol);
         *(p+*kol)=el;
    }
    int Del(int *a[], int *kol)
    {
        if (*kol<=-1) return 0;
        int *p=a;
        --(*kol);
        *(p+*kol+1)=0;
        return 1;
    }
    void Display(int *a[], int *kol)
    {
         printf("stack:");
         int i;
         for (i=0; i<=*kol; ++i) {
             printf("%i,", a[i]);
             }
         printf("\n");
    }
    int main(int argc, char *argv[])
    {
        int a[100], el=0, kol=-1,i;
        int *p=a;
        while (1) {
              printf("1:add, -1:del, 0:exit. command=");
              scanf("%i",&i);
              if (i==0) break;
              if (i==1) {
                        printf("ELEMENT=");
                        scanf("%i",&el);
                        Add(a,&kol,el);
                        }
              if (i==-1) 
                 if (!Del(a,&kol)) exit(1);
              Display(a,&kol);
              }	
      return 0;
    }
     
  20. dinar_007

    dinar_007 Мадемуазель

    Joined:
    18 Jan 2005
    Messages:
    1,019
    Likes Received:
    770
    Reputations:
    97
    Честно сказать, не в обиду конечно, но это самый тупой пример работы с указателями который я когда либо видел в жизни, нах... Кучи переменных, которые ты туда сюда тусуешь. Зачем заводить два указателя на один и тот же массив? Под настроение?
     
    #540 dinar_007, 29 Dec 2007
    Last edited: 29 Dec 2007
    2 people like this.
Thread Status:
Not open for further replies.