2015-11-02 4 views
2

Следующий код предназначен для печати наибольшего числа из списка целых чисел. Я получаю:Ошибка: malloc(): повреждение памяти в функции сравнения для сортировки

*** Error in `./a.out': malloc(): memory corruption: 0x0000000000bfe070 *** 

в списке (20 нулей):

[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 

Однако в выше, если я ставлю некоторые не нулевые элементы, которые я не получаю сообщение об ошибке.

Это мой код для функции сравнения:

bool comp(int a,int b) 
{ 
    if(a == b) 
     return true; 
    stringstream ss; 
    ss << a; 
    string a1 = ss.str(); 
    stringstream sss; 
    sss << b; 
    string b1 = sss.str(); 
    int i = 0; 
    int l1 = a1.length(); 
    int l2 = b1.length(); 
    while(i < l1 && i < l2) 
    { 
     if(a1[i] > b1[i]) 
      return true; 
     if(a1[i] < b1[i]) 
      return false; 
     i++; 
    } 
    if(l1 == l2) 
     return true; 
    if(l1 < l2) 
     if(b1[l1] > a1[0]) 
      return false; 
     else 
      return true; 
    else 
     if(a1[l2] > b1[0]) 
      return true; 
     else 
      return false; 
} 

Я использую СТЛ

sort(nums.begin(),nums.end(),comp); 

где НУМС вектор целых чисел.

EDIT 1:

Это весь код:

#include<iostream> 
#include<algorithm> 
#include<vector> 
#include<string> 
#include<sstream> 

using namespace std; 
bool comp(int a,int b) 
{ 
if(a == b) 
    return true; 
stringstream ss; 
ss << a; 
string a1 = ss.str(); 
stringstream sss; 
sss << b; 
string b1 = sss.str(); 
int i = 0; 
int l1 = a1.length(); 
int l2 = b1.length(); 
while(i < l1 && i < l2) 
{ 
    if(a1[i] > b1[i]) 
     return true; 
    if(a1[i] < b1[i]) 
     return false; 
    i++; 
} 
if(l1 == l2) 
    return true; 
if(l1 < l2) 
    if(b1[l1] > a1[0]) 
     return false; 
    else 
     return true; 
else 
    if(a1[l2] > b1[0]) 
     return true; 
    else 
     return false; 
} 
void largestNumber(vector<int>& nums) 
{ 

sort(nums.begin(),nums.end(),comp); 
/*string s = ""; 
vector<int>::iterator it = nums.begin(); 
while(it != nums.end()) 
{ 
    stringstream ss; 
    ss << *it; 
    s = s+ss.str(); 
    it++; 
} 
return s;*/ 
} 



int main() 
{ 
int n; 
cin>>n; 
vector<int> arr(n); 
for(int i = 0;i<n;i++) 
    cin>>arr[i]; 

largestNumber(arr);/* 
string s = largestNumber(arr); 
cout<<s<<endl;*/ 
} 
+4

Почему вы преобразовываете целые числа в строки и сравниваете строки, а не просто сравниваете целые числа напрямую? –

+0

Попробуйте запустить программу с valgrind. Это очень полезно при поиске ошибок, когда программа непреднамеренно пишет/читает из областей, которые она не должна. Полученная ошибка означает, что программа записала часть кучи, которая не была выделена пользователю. – Imran

ответ

4

Ваша функция комп нарушает strict weak ordering rule. Сортировка требует, чтобы функция сравнения соответствовала строгому правилу упорядочения. Если это обещание сломано, то и обещание std :: sort вести себя корректно. Infact, когда я скомпилирую это под MSVC (VS2015), я получаю ошибку утверждения, что функция сравнения не удовлетворяет условию упорядочения. Для, например, эта линия:

if(a == b) 
    return true; 

явно нарушает условие. Отметьте this сообщение для получения дополнительной информации.

BTW, если вы просто хотите, чтобы отсортировать целые числа в лексикографическом порядке, вы можете просто сделать

bool comp(int a,int b) 
{ 
    return to_string(a) < to_string(b); 
} 

Если вы хотите эквивалент «большего числа первого», просто поменять местами < с>

+0

Для записи этого не происходит в Microsoft Visual Studio 2012 версии 11.0.50727.1. –

+0

@ MuratKarakuş Вы компилировались в режиме отладки? – bashrc

+0

Нет, в режиме выпуска, но я использовал приложение и работает. –

0

Я использовал вашу comp функцию и создал образец тематическое исследование, чтобы изучить ошибку. Тем не менее, я не получил никакой ошибки для случая array of zeros. Пожалуйста, проверьте пример программы.

Ошибка

Однако ниже сценарий приводит к ошибке времени выполнения.

// Pay attention: Array stores numbers in descending order. 
// If we stored in ascending order, there won't be a problem. 
for(int i=20; i>0; ++i) 
    v.push_back(i); 

Надеюсь, что было бы полезно найти решение.

Пример программы

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <sstream> 
#include <iterator> 

using namespace std; 

bool comp(int a,int b) 
{ 
    if(a == b) 
     return true; 
    stringstream ss; 
    ss << a; 
    string a1 = ss.str(); 
    stringstream sss; 
    sss << b; 
    string b1 = sss.str(); 
    int i = 0; 
    int l1 = a1.length(); 
    int l2 = b1.length(); 
    while(i < l1 && i < l2) 
    { 
     if(a1[i] > b1[i]) 
      return true; 
     if(a1[i] < b1[i]) 
      return false; 
     i++; 
    } 
    if(l1 == l2) 
     return true; 
    if(l1 < l2) 
     if(b1[l1] > b1[l1-1]) 
      return false; 
     else 
      return true; 
    else 
     if(a1[l2] > a1[l2-1]) 
      return true; 
     else 
      return false; 
} 

int main(int argc, const char *argv[]) 
{ 
    vector<int> v; 
    for(int i=0; i<20; ++i) 
     v.push_back(0); 
    sort(v.begin(), v.end(), comp); 
    copy(v.begin(), v.end(), ostream_iterator<int>(cout, " ")); 
    return 0; 
} 
+0

Ну, это странно ... У меня все прокомментировано, но у меня все еще есть ошибка. – midi

+0

@midi Я нашел ошибку и указал с образцовой программой, пожалуйста, проверьте ее. –

+0

Я только что проверил ваш код. Ошибка сегментации на моей машине. ubuntu 64bit – midi

Смежные вопросы