1 Востаннє редагувалося Lena_17 (19.04.2021 22:58:57)

Тема: Помилка expression:_CrtIsValidHeapPointer(block)

Я написала код:

#include <iostream>

using namespace std;

class STACK
{
private:
    int* stack;
    int count = 0;

public:
    //конструктор без параметру
    STACK()
    {
        cout << "Enter number of items:";
        cin >> count;
        stack = new int[count];
        for (int i = 0;i < count;i++) {
            cout << "Item["<<i+1<<"]:";
            cin >> stack[i];
        }
        cout << " Constructor is did\n" << endl;
    }
        //конструктор з параметром
    STACK(int count)
    {
        this->count = count;
        stack = new int[this->count];
        for (int i = 0;i < this->count;i++)
        {
            cout << "Item[" << i + 1 << "] :";
            cin >> stack[i];
        }
        cout << " Constructor 2 is did.\n" << endl;
    }
    //деструктор
    ~STACK()
    {
        count = 0;
        delete[]stack;
        cout << " Destructor is did\n"<<this <<endl;
    }
    //функція виводу стеку
    void Print()
    {
        int pos = 0;
        cout << " Stack:" << endl;
        if (count == 0)
            cout << " is empty." << endl;
        for (int i = count - 1;i >= 0;i--)
        {
            cout << " Item[" << pos++ << "]=" << stack[i] << endl;
        }
        cout << endl;
    }
    //перевантажений операція порівняння 
    bool operator>(const STACK& st)
    {
        return this->count > st.count;
    }
    //перевантажена операція додавання елемента
    void operator+(int item)
    {
        int* point = stack;
        stack = new int[count+1];
        count++;
        for (int i = 0;i < count;i++)
            stack[i] = point[i];
        stack[count-1] = item;

        delete[]point;
    }
    //функція сортування стеків
    friend void sort(STACK mas_of_stacks[], STACK& st, int number)
    {
        int hlpr;
        for (int i = 0;i < number;i++)
        {
            hlpr = i;
            if (mas_of_stacks[hlpr] > mas_of_stacks[i + 1])
            {
                hlpr = i + 1;
                st = mas_of_stacks[hlpr];
                mas_of_stacks[hlpr] = mas_of_stacks[i];
                mas_of_stacks[i] = st;
            }
        }
    }
    //функція об'єднання елементів стеків
    friend int* Gathering(STACK mas_of_stacks[], int size)
    {
            int* arr=0, kst = all_elem_count(mas_of_stacks, size), hlpr = 0;
            arr = new int[kst];
            hlpr = kst;
            for (int i = 0;i < size;i++)
                for (int j = mas_of_stacks[i].count - 1;j >= 0;j--)
                    arr[--hlpr] = mas_of_stacks[i].stack[j];
            return arr;

    }
    //функція обчислення кількості елементів у масиві
    friend int all_elem_count(STACK mas[], int size)
    {
        int k = 0;
        for (int i = 0;i < size;i++)
            k += mas[i].count;
        return k;
    }
};
int main()
{
    int size,*stacks,kst=0;
    cout << "Enter number of stacks:" << endl;
    cin >> size;
    
    STACK *mas = new STACK [size],for_sort(0);

    sort(mas,for_sort, size);
    for (int i = 0;i < size;i++)
        mas[i].Print();
    stacks = Gathering(mas, size);
    kst = all_elem_count(mas,size);
    
    cout << "All elements:" << endl;
    for (int i = 0;i < kst;i++)
        cout <<"Item["<< i+1 <<"]: " << stacks[i] << endl;
    if (stacks != 0)
        delete[] stacks;
    delete[] mas;

    return 0;
}

Допоможіть ,будь ласка. Чому при компіляції вибиває помилку - expression:_CrtIsValidHeapPointer(block)?

2 Востаннє редагувалося ch0r_t (20.04.2021 07:10:32)

Re: Помилка expression:_CrtIsValidHeapPointer(block)

$ g++ -Wall -pedantic-errors main.cpp 
[tchort@mach42 temp]$ ./a.out 
Enter number of stacks:
1
Enter number of items:2
Item[1]:1
Item[2]:2
 Constructor is did

 Constructor 2 is did.

 Stack:
Segmentation fault (core dumped)

Все то компілюється... на моїй машині, без помилок. Дайте повний вивід компілятору.

Подякували: koala, leofun012

3 Востаннє редагувалося Lena_17 (20.04.2021 10:10:55)

Re: Помилка expression:_CrtIsValidHeapPointer(block)

tchort написав:
$ g++ -Wall -pedantic-errors main.cpp 
[tchort@mach42 temp]$ ./a.out 
Enter number of stacks:
1
Enter number of items:2
Item[1]:1
Item[2]:2
 Constructor is did

 Constructor 2 is did.

 Stack:
Segmentation fault (core dumped)

Все то компілюється... на моїй машині, без помилок. Дайте повний вивід компілятору.



У мене є приклад для вводу:
3
2
4
5
1
9
3
2
7
6
Програма працює через раз і у кінці спрацьовують не всі деструктори(найчастіше для конструктора з параметром).

4

Re: Помилка expression:_CrtIsValidHeapPointer(block)

Segmentation fault (core dumped)

усе погано

Подякували: wander1

5 Востаннє редагувалося wander (20.04.2021 12:42:36)

Re: Помилка expression:_CrtIsValidHeapPointer(block)

tchort написав:

Все то компілюється... на моїй машині, без помилок.

Цікаво, в якому це місці без помилок? :)

Прихований текст
Program stderr
=================================================================
==1==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x608000000080 at pc 0x0000004fd827 bp 0x7ffe17c53310 sp 0x7ffe17c53308
READ of size 4 at 0x608000000080 thread T0
    #0 0x4fd826  (/app/output.s+0x4fd826)
    #1 0x4fcb58  (/app/output.s+0x4fcb58)
    #2 0x4fba24  (/app/output.s+0x4fba24)
    #3 0x7ffb7fe820b2  (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
    #4 0x41f40d  (/app/output.s+0x41f40d)

0x608000000080 is located 8 bytes to the right of 88-byte region [0x608000000020,0x608000000078)
allocated by thread T0 here:
    #0 0x4f81c8  (/app/output.s+0x4f81c8)
    #1 0x4fb948  (/app/output.s+0x4fb948)
    #2 0x7ffb7fe820b2  (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)

SUMMARY: AddressSanitizer: heap-buffer-overflow (/app/output.s+0x4fd826) 
Shadow bytes around the buggy address:
  0x0c107fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c107fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c107fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c107fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c107fff8000: fa fa fa fa ac 00 00 00 00 00 00 00 00 00 00 fa
=>0x0c107fff8010:[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c107fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c107fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c107fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c107fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c107fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==1==ABORTING

Lena_17, код жахливий, читати його неможливо. Підозрюю, що ви виходите за межі масиву десь у ф-ї sort.
Берете в руки дебагер і шукаєте. Я навіть дам підказку, дивіться, що відбувається на останній ітерації циклу.  І ймовірно, це не єдине місце.
Також я не розумію, що саме ви сортуєте.

Подякували: leofun011

6

Re: Помилка expression:_CrtIsValidHeapPointer(block)

wander написав:
tchort написав:

Все то компілюється... на моїй машині, без помилок.

Цікаво, в якому це місці без помилок? :)

Правильно, компілація без помилок. Про виконання вже зкомпільованої програми нічого не було.

Подякували: ch0r_t, P.Y.2

7 Востаннє редагувалося wander (20.04.2021 15:11:25)

Re: Помилка expression:_CrtIsValidHeapPointer(block)

leofun01 написав:
wander написав:
tchort написав:

Все то компілюється... на моїй машині, без помилок.

Цікаво, в якому це місці без помилок? :)

Правильно, компілація без помилок. Про виконання вже зкомпільованої програми нічого не було.

Все цілком було, якщо вміти читати. Очевидно, що Access Violation (про що повідомляє _CrtIsValidHeapPointer) в компайл таймі неможливий, a TC - очевидно, що новачок, тож не бачу жодного сенсу у вашій придирці.

P.S. - Підмічу, що у виводі був продемонстрований запуск програми, з жирним повідомленням про Segmentation fault, проте так, можна і далі удавати, що нічого не було :)

8

Re: Помилка expression:_CrtIsValidHeapPointer(block)

ur_naz написав:

усе погано

Чого це? Через те що код важко читабельний?
Lena_17, що повинен виконати код, та що не виконує?

9

Re: Помилка expression:_CrtIsValidHeapPointer(block)

Droid 77 написав:
ur_naz написав:

усе погано

Чого це? Через те що код важко читабельний?
Lena_17, що повинен виконати код, та що не виконує?

Код спочатку повинен вивести відсортовані за зростанням кількості елементів стеки, а далі додати усі елементи цих стеків в один.
Код компілюється через раз.Результат правильний, але не спрацьовує деструктор для конструктора з параметром і видає помилку

10 Востаннє редагувалося Droid 77 (20.04.2021 16:31:07)

Re: Помилка expression:_CrtIsValidHeapPointer(block)

Lena_17 написав:

Код компілюється через раз

Такого не буває.
Код збирається, або ні (через певні помилки).
Якщо є помилки або попередження під час побудови. То будьте такі ласкаві, озвучте ті попередження.

11

Re: Помилка expression:_CrtIsValidHeapPointer(block)

Я дописала ще одного перевантаженого оператора

STACK& operator=(const STACK& st)
    {
        this->count = st.count;
        if (st.stack != NULL)
            delete[]stack;
        this->stack = new int[st.count];
        for (int i = 0;i < st.count;i++)
            this->stack[i] = st.stack[i];
        return *this;
    }

Тепер усе працює)

Подякували: 0xDADA11C71

12

Re: Помилка expression:_CrtIsValidHeapPointer(block)

wander написав:

Очевидно, що Access Violation (про що повідомляє _CrtIsValidHeapPointer) в компайл таймі неможливий, a TC - очевидно, що новачок, тож не бачу жодного сенсу у вашій придирці.

Очевидно, що новачок, у даному випадку, справді ще не розрізняє помилок компіляції та помилок виконання. Що, загалом, фейл — новачкові необхідно повторити теорію, чим компілятор відрізняється від інтерпретатора, та зрозуміти, чому компілятор не може видавати ніяких помилок після того, як вже відкомпільована ним програма запустилась і навіть щось вивела на екран. Якщо помилка виникає тоді, коли програма вже працює, то її видає не компілятор (який вже виконав свою роботу — згенерував .exe-файл), а сама програма. Якщо порівняти програмування з виробництвом роботів, то текст програми — це креслення, компілятор — спеціальна машина, що за цим кресленням робить сконструйованого вами робота, а тому проблеми бувають двох типів:
1) ваше креслення непридатне для виготовлення роботів — це помилка компіляції;
2) сконструйованого вами робота вдалося зробити, він почав виконувати якісь дії, але щось собі зламав — це помилка виконання.

А от чому спеціаліст вирішив їх плутати теж, незовсім очевидно.

Подякували: 0xDADA11C7, ch0r_t2

13

Re: Помилка expression:_CrtIsValidHeapPointer(block)

P.Y. написав:

Очевидно, що новачок, у даному випадку, справді ще не розрізняє помилок компіляції та помилок виконання. Що, загалом, фейл — новачкові необхідно повторити теорію, чим компілятор відрізняється від інтерпретатора, та зрозуміти, чому компілятор не може видавати ніяких помилок після того, як вже відкомпільована ним програма запустилась і навіть щось вивела на екран. Якщо помилка виникає тоді, коли програма вже працює, то її видає не компілятор (який вже виконав свою роботу — згенерував .exe-файл), а сама програма.

*BRAVO*
Тільки сама програма теж може не видавати помилок :)

P.Y. написав:

Якщо порівняти програмування з виробництвом роботів, то текст програми — це креслення, компілятор — спеціальна машина, що за цим кресленням робить сконструйованого вами робота, а тому проблеми бувають двох типів:
1) ваше креслення непридатне для виготовлення роботів — це помилка компіляції;
2) сконструйованого вами робота вдалося зробити, він почав виконувати якісь дії, але щось собі зламав — це помилка виконання.

*FACEPALM*

P.Y. написав:

А от чому спеціаліст вирішив їх плутати теж, незовсім очевидно.

Same-shit..

14

Re: Помилка expression:_CrtIsValidHeapPointer(block)

wander написав:

Тільки сама програма теж може не видавати помилок :)

Ну, так. Т.зв. тихі помилки. Проте, в даному випадку, помилка тихою не була.

15

Re: Помилка expression:_CrtIsValidHeapPointer(block)

wander написав:

*FACEPALM*

*DONT_KNOW*
Безумовно, аналогія дуже приблизна. Проте, образні порівняння сприймаються легше, ніж дерев'яна мова формальних дефініцій, які можна зазубрити й не розуміти.

16

Re: Помилка expression:_CrtIsValidHeapPointer(block)

P.Y. написав:
wander написав:

Тільки сама програма теж може не видавати помилок :)

Ну, так. Т.зв. тихі помилки. Проте, в даному випадку, помилка тихою не була.

Ну так, в цьому випадку, помилку видала не програма.

17

Re: Помилка expression:_CrtIsValidHeapPointer(block)

wander написав:
P.Y. написав:
wander написав:

Тільки сама програма теж може не видавати помилок :)

Ну, так. Т.зв. тихі помилки. Проте, в даному випадку, помилка тихою не була.

Ну так, в цьому випадку, помилку видала не програма.

Але й не компілятор — для нього програма цілком валідна.
Отже, хто?

Подякували: leofun01, ch0r_t2

18

Re: Помилка expression:_CrtIsValidHeapPointer(block)

P.Y. написав:
wander написав:
P.Y. написав:

Ну, так. Т.зв. тихі помилки. Проте, в даному випадку, помилка тихою не була.

Ну так, в цьому випадку, помилку видала не програма.

Але й не компілятор — для нього програма цілком валідна.
Отже, хто?

Для х86/х86_64 виключення access violation "видає" CPU, а саме MMU до ОС.

Подякували: leofun011

19

Re: Помилка expression:_CrtIsValidHeapPointer(block)

Тобто, в даному випадку, «робот» не розрахував свої дії й проломив дірку в стіні, тим самим отримавши незаконний доступ до сусідів? :)

Подякували: 0xDADA11C7, ch0r_t2

20

Re: Помилка expression:_CrtIsValidHeapPointer(block)

P.Y. написав:

Тобто, в даному випадку, «робот» не розрахував свої дії й проломив дірку в стіні, тим самим отримавши незаконний доступ до сусідів? :)

Кидайте це діло, ваші аналогії тут недоречні.

Подякували: leofun011