У меня есть код на C++, я использую MSC9 для его компиляции.
Он постоянно аварийно завершает работу. Например, происходит сбой, если он вызывается из Perl с использованием ``, но он не аварийно завершает работу, когда он вызывается из командной строки или из Ultimate++.
Я имею в виду вызов из Perl например. f.exe arg1 arg2 arg3
Трассировка стека мало что показывает. Трассировка программы построчно показала, что при возврате программа в конце завершается сбоем...
Так оно и есть
int funcname()
{
return 0;
У меня есть структура, подобная этой:
struct complexstr
{
pvector v;
string v2;
hash_map hm;
vector vs; // similar
int i;
};
Похоже, это не удалось, потому что эта строка:
complexstr s1;
complexstr s2;
s2=s1; // it seems to fail here, if this is not there... there is no error.
Я думаю, проблема связана с классом ниже...
std::copy верен в pvectoroperator=(const pvector &pv), верно?< /p>
pvector — вектор, совместимый с Perl... Его индексы могут превышать выделенный размер вектора.
Update1:
Мне поступили предположения, что в задании есть утечка.
Я изменил задание...
Вот как оно теперь выглядит:
pvector& operator=(const pvector &pv)
{
delete [] m_rgArray;
m_rgArray=new value_type[pv.allocated];
m_nIndex=pv.m_nIndex;
allocated=pv.allocated;
std::copy(pv.m_rgArray, pv.m_rgArray + pv.allocated, m_rgArray);
return *this;
}
Примечание: при добавлении & к возвращаемому типу сбой все равно остался.
Однако после устранения утечки добавлено удаление [] m_rgArray; ,
программа больше не вылетает. Я не понимаю. Насколько мне известно, утечки
не приводят к сбоям. Кажется, проблема решена(?). Знак вопроса показывает мое удивление.
Обновление2:
Нет, проблема вернулась. Он просто исчез на некоторое время.
Обновление3: Кажется, я нашел его. Я использовал утилиту из инструментов отладки Microsoft под названием gflags.exe иwindbg.exe, чтобы найти точное местоположение.
Я использовал gflags.exe /p /enable myprog.exe /full, чтобы включить исключения для ошибок кучи..На данный момент я думаю, что ошибка была вызвана FindClose(handle); где дескриптор был случайным значением, а не инициализированным.
Старая версия:
template
class pvector
{
public:
_Ty * m_rgArray; // Declare array
int m_nIndex; // Index to array
int allocated;
_Ty undefvalue;
typedef _Ty value_type;
typedef value_type & reference;
typedef const value_type & const_reference;
typedef custom_iterator iterator;
typedef custom_iterator const_iterator;
typedef int difference_type;
typedef int size_type;
//typedef typename pvector_type_traits::default_value default_value;
pvector() : m_nIndex(0)
{ // init index to 0
m_rgArray = new value_type[10];
allocated = 10;
fill(0);
}
pvector(size_type s) : m_nIndex(0)
{ // init index to 0
size_type defsize = 10;
if (s>10)
{
defsize = s;
}
m_rgArray = new value_type[defsize];
allocated = defsize;
fill(0);
}
pvector(pvector const& pv)
: m_rgArray(new value_type[pv.allocated]),
m_nIndex(pv.m_nIndex),allocated(pv.allocated)
{
std::copy(pv.m_rgArray, pv.m_rgArray + pv.allocated, m_rgArray);
}
pvector operator=(const pvector &pv)
{
m_rgArray=new value_type[pv.allocated];
m_nIndex=pv.m_nIndex;
allocated=pv.allocated;
std::copy(pv.m_rgArray, pv.m_rgArray + pv.allocated, m_rgArray);
return *this;
}
void clear()
{
m_nIndex=0;
fill(allocated);
}
~pvector() {
delete []m_rgArray;
}
size_type size() const
{ // return length of sequence
return m_nIndex;
}
size_type max_size() const
{ // return maximum possible length of sequence
return 0;
}
void fill(size_type si)
{
for (size_type i = si;i 0 ? false : true);
}
iterator begin()
{ // return iterator for beginning of mutable sequence
return iterator(&m_rgArray[0]);
}
const_iterator begin() const
{
return const_iterator(&m_rgArray[0]);
}
iterator end()
{ // return iterator for end of mutable sequence
return iterator(&m_rgArray[m_nIndex]);
}
const_iterator end() const
{
return const_iterator(&m_rgArray[m_nIndex]);
}
reference operator[](size_type i)
{
if (m_nIndex>i)
{
return m_rgArray;
}
else if (i >= allocated)
{
resize(i * 2);
}
m_nIndex = i + 1;
return m_rgArray;
}
void resize(size_type s)
{
value_type * m_rgArray2;
size_type old_allocated = allocated;
allocated = s;
m_rgArray2 = new value_type[allocated];
//if (allocated>m_nIndex)
//{
// m_nIndex=allocated;
// }
// cout
Подробнее здесь: https://stackoverflow.com/questions/121 ... hink-it-is
Программа аварийно завершает работу при выходе из функции C++... Как вы думаете, что это такое? ⇐ C++
Программы на C++. Форум разработчиков
1728595208
Anonymous
У меня есть код на C++, я использую MSC9 для его компиляции.
Он постоянно аварийно завершает работу. Например, происходит сбой, если он вызывается из Perl с использованием ``, но он не аварийно завершает работу, когда он вызывается из командной строки или из Ultimate++.
Я имею в виду вызов из Perl например. f.exe arg1 arg2 arg3
Трассировка стека мало что показывает. Трассировка программы построчно показала, что при возврате программа в конце завершается сбоем...
Так оно и есть
int funcname()
{
return 0;
У меня есть структура, подобная этой:
struct complexstr
{
pvector v;
string v2;
hash_map hm;
vector vs; // similar
int i;
};
Похоже, это не удалось, потому что эта строка:
complexstr s1;
complexstr s2;
s2=s1; // it seems to fail here, if this is not there... there is no error.
Я думаю, проблема связана с классом ниже...
std::copy верен в pvectoroperator=(const pvector &pv), верно?< /p>
pvector — вектор, совместимый с Perl... Его индексы могут превышать выделенный размер вектора.
Update1:
Мне поступили предположения, что в задании есть утечка.
Я изменил задание...
Вот как оно теперь выглядит:
pvector& operator=(const pvector &pv)
{
delete [] m_rgArray;
m_rgArray=new value_type[pv.allocated];
m_nIndex=pv.m_nIndex;
allocated=pv.allocated;
std::copy(pv.m_rgArray, pv.m_rgArray + pv.allocated, m_rgArray);
return *this;
}
Примечание: при добавлении & к возвращаемому типу сбой все равно остался.
Однако после устранения утечки добавлено удаление [] m_rgArray; ,
программа больше не вылетает. Я не понимаю. Насколько мне известно, утечки
не приводят к сбоям. Кажется, проблема решена(?). Знак вопроса показывает мое удивление.
Обновление2:
Нет, проблема вернулась. Он просто исчез на некоторое время.
Обновление3: Кажется, я нашел его. Я использовал утилиту из инструментов отладки Microsoft под названием gflags.exe иwindbg.exe, чтобы найти точное местоположение.
Я использовал gflags.exe /p /enable myprog.exe /full, чтобы включить исключения для ошибок кучи..На данный момент я думаю, что ошибка была вызвана FindClose(handle); где дескриптор был случайным значением, а не инициализированным.
Старая версия:
template
class pvector
{
public:
_Ty * m_rgArray; // Declare array
int m_nIndex; // Index to array
int allocated;
_Ty undefvalue;
typedef _Ty value_type;
typedef value_type & reference;
typedef const value_type & const_reference;
typedef custom_iterator iterator;
typedef custom_iterator const_iterator;
typedef int difference_type;
typedef int size_type;
//typedef typename pvector_type_traits::default_value default_value;
pvector() : m_nIndex(0)
{ // init index to 0
m_rgArray = new value_type[10];
allocated = 10;
fill(0);
}
pvector(size_type s) : m_nIndex(0)
{ // init index to 0
size_type defsize = 10;
if (s>10)
{
defsize = s;
}
m_rgArray = new value_type[defsize];
allocated = defsize;
fill(0);
}
pvector(pvector const& pv)
: m_rgArray(new value_type[pv.allocated]),
m_nIndex(pv.m_nIndex),allocated(pv.allocated)
{
std::copy(pv.m_rgArray, pv.m_rgArray + pv.allocated, m_rgArray);
}
pvector operator=(const pvector &pv)
{
m_rgArray=new value_type[pv.allocated];
m_nIndex=pv.m_nIndex;
allocated=pv.allocated;
std::copy(pv.m_rgArray, pv.m_rgArray + pv.allocated, m_rgArray);
return *this;
}
void clear()
{
m_nIndex=0;
fill(allocated);
}
~pvector() {
delete []m_rgArray;
}
size_type size() const
{ // return length of sequence
return m_nIndex;
}
size_type max_size() const
{ // return maximum possible length of sequence
return 0;
}
void fill(size_type si)
{
for (size_type i = si;i 0 ? false : true);
}
iterator begin()
{ // return iterator for beginning of mutable sequence
return iterator(&m_rgArray[0]);
}
const_iterator begin() const
{
return const_iterator(&m_rgArray[0]);
}
iterator end()
{ // return iterator for end of mutable sequence
return iterator(&m_rgArray[m_nIndex]);
}
const_iterator end() const
{
return const_iterator(&m_rgArray[m_nIndex]);
}
reference operator[](size_type i)
{
if (m_nIndex>i)
{
return m_rgArray[i];
}
else if (i >= allocated)
{
resize(i * 2);
}
m_nIndex = i + 1;
return m_rgArray[i];
}
void resize(size_type s)
{
value_type * m_rgArray2;
size_type old_allocated = allocated;
allocated = s;
m_rgArray2 = new value_type[allocated];
//if (allocated>m_nIndex)
//{
// m_nIndex=allocated;
// }
// cout
Подробнее здесь: [url]https://stackoverflow.com/questions/1211492/program-crashes-when-leaving-a-c-function-what-do-you-think-it-is[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия