Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 149

_BLOCK_TYPE_IS_VALID

13.06.2018, 18:06. Показов 997. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте !
Пользуясь отладкой и Яндексом пришёл к тому , что у меня это происходит из за того что я удаляю один и тот же объект 2 раза
Подскажите , пожалуйста , так ли я считаю и как это можно исправить?
(При удалении деструкторов всё работает как надо)

Кликните здесь для просмотра всего текста
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include "stdafx.h" 
#include <iostream> 
#include "time.h"
#include <iomanip>
#include <cstddef> // size_t
#include <cstring>// strlen, strcpy
#include <list>
#include <algorithm>
#include <iterator>
#pragma warning(disable:4996)
 
using namespace std;
 
 
struct String {
 
        String(const char *str = "") {
                size = 0;
                for (const char* p = str; *p != '\0'; ++p)
                        ++size;
 
                this->str = new char[size + 1];
 
                for (unsigned i = 0; i != size + 1; ++i)
                        this->str[i] = str[i];
        }
 
        String(size_t n, char c) :
                size(n)
        {
                str = new char[size + 1];
                for (unsigned i = 0; i != size; ++i)
                        str[i] = c;
                str[size] = 0;
        }
 
        ~String() {
                delete[] str;
        }
 
        void append(String &other) {
                char* new_str = new char[size + other.size + 1];
 
                unsigned i = 0;
                for (; i != size; ++i)
                        new_str[i] = str[i];
                for (unsigned j = 0; j != other.size; ++i, ++j)
                        new_str[i] = other.str[j];
                new_str[size + other.size] = '\0';
 
                size = size + other.size;
 
                delete[] str;
 
                str = new_str;
        }
 struct buff
        {
            buff(char*const str,int p=0):size(0),point(p)
            {
                char* S=str;
                while(*S++)
                    size++;
                this->str=new char[size];
                for(int i=0;i<size;i++)
                    this->str[i]=str[i];
                this->str[size]='\0';
                    
            }
            /*~buff()
            {
                delete[] str;
            }*/
            String operator [](int s) const
            {
                int size=s-point+this->size;
                char *Str =new char[size+1];
                for(int i=0;i<size;i++)
                Str[i]=this->str[i];
                Str[size]='\0';
                String String(Str);
                delete [] Str;
                return String;
            }
             size_t size;
             char *str;
             int point;
        };
 
        buff  operator [](int s) const
        {
            int size=this->size-s;
            char *Str =new char[size+1];
            for(int i=s;i<this->size;i++)
                Str[i-s]=this->str[i];
            Str[size]='\0';
            buff buff(Str,this->size);
            delete [] Str;
            return  buff;
        }
 
        size_t size;
        char *str;
};
 
 
 
int main() 
{
        String const hello("hello");
String const hell = hello[0][4]; // теперь в hell хранится подстрока "hell"
String const ell  = hello[1][4]; // теперь в ell хранится подстрока "ell"
        return 0;
}
0
Лучшие ответы (1)
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.06.2018, 22:38
Это вообще работает? Почему пустую строку возвращает из []?
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
14.06.2018, 03:46
Цитата Сообщение от yuriybolotin99 Посмотреть сообщение
так ли я считаю
Отчасти да. Но код содержит и массу других ошибок.

Цитата Сообщение от yuriybolotin99 Посмотреть сообщение
и как это можно исправить?
Распространенные ошибки

А также учиться не вылетать за пределы массива, как например здесь

C++
1
2
3
4
this->str=new char[size];
for(int i=0;i<size;i++)
  this->str[i]=str[i];
this->str[size]='\0';
Причем в основной массе кода видно, что автор в курсе этой проблемы, а здесь вдруг она присутствует во всей красе.
1
6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 149
14.06.2018, 12:40  [ТС]
Добавлено через 1 минуту
nmcf, Я так понимаю потому что строка удаляется в деструкторе

Добавлено через 1 минуту
TheCalligrapher, Спасибо большое за ответ!
Я добавил конструкторы копирования и исправил в конструкторе buff выход за пределы массива, но проблема осталась при этом ,если убрать деструкторы , то всё работает как надо
Кликните здесь для просмотра всего текста
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "stdafx.h" 
#include <iostream> 
#include "time.h"
#include <iomanip>
#include <cstddef> // size_t
#include <cstring>// strlen, strcpy
#include <list>
#include <algorithm>
#include <iterator>
#pragma warning(disable:4996)
 
using namespace std;
 
 
struct String {
 
        String(const char *str = "") {
                size = 0;
                for (const char* p = str; *p != '\0'; ++p)
                        ++size;
 
                this->str = new char[size + 1];
 
                for (unsigned i = 0; i != size + 1; ++i)
                        this->str[i] = str[i];
        }
        
String(const String & S):size(S.size),str(S.str) // конструктор копирования 
        {
        }
 
        String(size_t n, char c) :
                size(n)
        {
                str = new char[size + 1];
                for (unsigned i = 0; i != size; ++i)
                        str[i] = c;
                str[size] = 0;
        }
 
        ~String() {
                delete[] str;
        }
 
        void append(String &other) {
                char* new_str = new char[size + other.size + 1];
 
                unsigned i = 0;
                for (; i != size; ++i)
                        new_str[i] = str[i];
                for (unsigned j = 0; j != other.size; ++i, ++j)
                        new_str[i] = other.str[j];
                new_str[size + other.size] = '\0';
 
                size = size + other.size;
 
                delete[] str;
 
                str = new_str;
        }
 
 struct buff
        {
            buff(char*const str,int p=0):size(0),point(p)
            {
                char* S=str;
                while(*S++)
                    size++;
                this->str=new char[size+1];
                for(int i=0;i<size;i++)
                    this->str[i]=str[i];
                this->str[size]='\0';
                    
            }
            buff(const buff & b):size(b.size),point(b.point),str(b.str)  //конструктор копирования 
            {
            }
            buff()
            {
                delete[] str;
            }
            String operator [](int s) const
            {
                int size=s-point+this->size;
                char *Str =new char[size+1];
                for(int i=0;i<size;i++)
                Str[i]=this->str[i];
                Str[size]='\0';
                String String(Str);
                delete [] Str;
                return String;
            }
             size_t size;
             char *str;
             int point;
        };
 
        buff  operator [](int s) const
        {
            int size=this->size-s;
            char *Str =new char[size+1];
            for(int i=s;i<this->size;i++)
                Str[i-s]=this->str[i];
            Str[size]='\0';
            buff buff(Str,this->size);
            delete [] Str;
            return  buff;
        }
 
        size_t size;
        char *str;
};
 
 
 
int main() 
{
String const hello("hello");
String const hell = hello[0][4]; // теперь в hell хранится подстрока "hell"
String const ell  = hello[1][4]; // теперь в ell хранится подстрока "ell"
        return 0;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12933 / 6801 / 1820
Регистрация: 18.10.2014
Сообщений: 17,213
14.06.2018, 16:43
Лучший ответ Сообщение было отмечено yuriybolotin99 как решение

Решение

Цитата Сообщение от yuriybolotin99 Посмотреть сообщение
Я добавил конструкторы копирования
Вы добавили бессмысленные конструкторы копирования. Такие конструкторы копирования у вас были и раньше - они были неявно сгенерированы компилятором и делали то же самое, что и ваши конструкторы копирования сейчас. Проблема в том, что от таких конструкторов копирования никакой пользы нет. Конструктор копирования должен создавать полностью независимый объект, со своей независимой памятью для str. Именно для этого его надо писать руками.

Копирующий оператор присваивания тоже написать не забывайте.
1
6 / 4 / 3
Регистрация: 28.10.2014
Сообщений: 149
14.06.2018, 22:10  [ТС]
Спасибо огромное теперь всё работает без ошибок!
я ещё не поставил ~ перед одним их деструкторов поэтому была проблема с утечкой памяти
благодаря Вам и этой задаче я понял насколько важны копиконструкторы !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru