VDA
1

Создал поток. В нем выделил буффер. Поток выполнился, но из за буфера ругнулся.

29.09.2009, 19:46. Показов 1147. Ответов 2
Метки нет (Все метки)

В функции треда создал буфер
C++
1
char tbuf[1000];
но после того как тред выполнился выскочила ошибка
Run-Time Check Failure #2 - Stack around the variable 'tbuf' was corrupted.

вот код функция треда
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
DWORD WINAPI GetThread(PVOID pvParam)
{
  
 
  int s;
  int rs;
  s=*((int*)pvParam);
  rs=*((int*)pvParam+1);
  char tbuf[1000];   //вот этот буффер выделил и из-за него траблы
  
  for(;;)
  {     
       
        memset(tbuf,0,1000);
        rs=recv(s,tbuf,1000,0);
        if(rs<=0)
        {
            
            closesocket(s);
            //delete [] tbuf;
            perror('Cant recv');
            return (1);
        }
        else
        {   
            tbuf[rs]=''
            std::cout<<(char*)tbuf<<std::flush;
        }
   }
 
   return 0;
}
По идее поток, закрывается и так как tbuf стековый массив он должен уничтожится без проблем, но выскакивает ошибка.
Может кто сталкивался с этим ?

Дмитрий.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2009, 19:46
Ответы с готовыми решениями:

Подсчет сколько раз выполнился поток
Есть два потока, которые выполняют один метод поочередно. Как посчитать сколько раз каждый поток...

Создал поток не могу закрыть
Как завершить поток, если он создан в другом методе? private void timer1_Tick(object...

Создал поток в классе (visual studio 2015). Возникли ошибки. Как исправить?
На нижеуказанных скринах описаны ошибки. Помогите пожалуйста их исправить. Потому что взял эти...

Поток освобождается, но переменная, которой был присвоен этот поток, не очищается
Мне интересно, вот поток отработал, стоит FreeOnTerminate:=True; Поток освобождается, но переменной...

2
80 / 56 / 68
Регистрация: 15.03.2007
Сообщений: 6,908
30.09.2009, 11:19 2
По моему переполнение буфера у тебя возникает. Размер массива 1000 символов. Функция recv поулчает 1000 символов и записывает их в массив. Затем в строке tbuf[rs]='*' ты добавляешь конец строки. Но куда он добавляется, если rs=1000? За пределы массива, потому что последний индекс это 999. Увеличь размер буфера на 1 - т.е. char tbuf[1001], а все остальное оставь как есть.
0
VDA
30.09.2009, 11:42 3
Точно.Так и есть.
Спасибо.

Дмитрий.
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2009, 11:42

Ошибка-Текущий поток должен быть задан как поток однопоточного контейнера STA
Значит модуль в нем классы.Я создаю свое гуи.Так вот при вызове процедуры котрая копирует текст(в...

Разработать программу, в которой основной поток, принимает поток ввода и контролирует созданные потоки.
что-то не-то с кодом. 2 дня ломаю голову :( //#define _REENTRANT #include &lt;stdio.h&gt; #include...

OpenFileDialog и потоки: Текущий поток должен быть задан как поток однопоточного контейнера (STA)
Со стартового окна запускаю формы вот так: new Thread(() =&gt; { ...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.