Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Timama
10 / 10 / 9
Регистрация: 30.03.2016
Сообщений: 163
#1

Как исправить ошибку - C++

11.08.2016, 11:47. Просмотров 383. Ответов 22
Метки нет (Все метки)

доброго времени суток.
вот у меня есть тут такой дефолт констрактор.
C++
1
2
3
4
5
MString::MString():length(8){
    this->data = new char[this->length];
    assert(data != 0);
    this->data = "UNKNOWN\0";
}
во время компиляции выдаеться вот такая вот ошибка. что не так написано???
заранее спасибо.
http://www.cyberforum.ru/cpp-beginners/thread1541002.html
0
Миниатюры
Как исправить ошибку  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2016, 11:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как исправить ошибку (C++):

Как исправить ошибку?
#include <stdio.h> #include <tchar.h> #include <stdlib.h> #include...

Как исправить ошибку?
Ошибка 7 error LNK1120: 1 неразрешенных внешних элементов Ошибка 6 error...

Как исправить ошибку?
#include <fstream.h> #include <string.h> #include <conio.h> #include...

Как исправить ошибку
Process exited with return value 3221225725 выскакивает после запуска...

Как исправить ошибку?
#include <conio.h> #include <math.h> #include <iostream> using namespace...

22
Slip.
92 / 92 / 33
Регистрация: 17.03.2012
Сообщений: 536
Завершенные тесты: 1
11.08.2016, 11:57 #2
Скорее всего вы освобождаете память там, где она еще не занята.
Лучше присылать весь код.
0
Timama
10 / 10 / 9
Регистрация: 30.03.2016
Сообщений: 163
11.08.2016, 12:00  [ТС] #3
Это Header программы

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
#ifndef MSTRING_H
#define MSTRING_H
#define EOL '\0'
#define SPACE ' '
#include <assert.h>
 
class MString{
private:
    char* data;
    int length;
public:
    MString();
    MString(char* str);
    MString(int len);
    MString(const MString& obj);
    ~MString();
    char* getData();
    void setData();
    void strlen();
    void strlen(char* data);
    void operator + (const MString& obj);
    void operator - (const MString& obj);
    void operator == (const MString& obj);
    void operator != (const MString& obj);
    void operator >(const MString& obj);
    void operator <=(const MString& obj);
    void operator <(const MString& obj);
    void operator >=(const MString& obj);
    char operator [] (const MString& obj);
    void operator +=(const MString& obj);
};
#endif MSTRING H
это пока что написанный cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
MString::MString():length(8){
    this->data = new char[this->length];
    assert(data != 0);
    this->data = "UNKNOWN\0";
}
 
MString::~MString(){
    delete[] data;
}
 
MString::MString(const MString& obj){
    this->length = obj.length;
    this->data = new char[length];
    assert(data != 0);
    for (int i = 0; i < this->length; i++)
        this->data[i] = obj.data[i];
}
0
Chainik228
0 / 0 / 2
Регистрация: 18.10.2015
Сообщений: 46
Завершенные тесты: 1
11.08.2016, 12:02 #4
char? Чем string не угодил?
И тем более ты не можешь изменить char[] напрямую после того как задал.
0
Timama
10 / 10 / 9
Регистрация: 30.03.2016
Сообщений: 163
11.08.2016, 12:03  [ТС] #5
Тем что я должен написать сам string.
почему так не [] потому что мне надо динамически выделять память.
0
Slip.
92 / 92 / 33
Регистрация: 17.03.2012
Сообщений: 536
Завершенные тесты: 1
11.08.2016, 12:04 #6
Цитата Сообщение от Chainik228 Посмотреть сообщение
char? Чем string не угодил?
У человека задание, видимо, определить свой строковый тип на основе char, с кучей операторов.
И да, перед тем, как делать очередной new, стоит, наверное, сделать и delete, чтоб не было утечки.
И не забудьте перед удалением проверить, существует ли указатель.

И еще вы не привели пример того, как вы используете ваш этот класс.
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
11.08.2016, 12:07 #7
Цитата Сообщение от Timama Посмотреть сообщение
this->data = "UNKNOWN\0";
Зачем вот эта строчка? И зачем в строковом литерале еще один терминальный ноль? Изза этого и проблема. Вы пытаетесь освободить память, которую Вы не выделяли.
0
Chainik228
0 / 0 / 2
Регистрация: 18.10.2015
Сообщений: 46
Завершенные тесты: 1
11.08.2016, 12:09 #8
Цитата Сообщение от Timama Посмотреть сообщение
почему так не [] потому что мне надо динамически выделять память.
Поищите функцию malloc.
0
Timama
10 / 10 / 9
Регистрация: 30.03.2016
Сообщений: 163
11.08.2016, 12:10  [ТС] #9
мне надо что бы def c'tor создал мне массив char в котором записано "UNKNOWN".

Добавлено через 56 секунд
это CPP не C
0
Chainik228
0 / 0 / 2
Регистрация: 18.10.2015
Сообщений: 46
Завершенные тесты: 1
11.08.2016, 12:12 #10
Цитата Сообщение от Timama Посмотреть сообщение
это CPP не C
Никто не запрещает использовать cstdlib и взять оттуда malloc.
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
11.08.2016, 12:12 #11
Лучший ответ Сообщение было отмечено Timama как решение

Решение

В приведенном Вами литерале "UNKNOWN\0" 9 символов, так как присутсвует неявный ноль.
Инициализировать деволтную строку нужно вот так:
C++
1
strcpy( data, "UNKNOWN" );
1
pav1uxa
1855 / 1709 / 802
Регистрация: 23.01.2014
Сообщений: 6,082
Завершенные тесты: 1
11.08.2016, 12:18 #12
Цитата Сообщение от Timama Посмотреть сообщение
во время компиляции выдаеться
Наверное во время запуска приложения, а не компиляции? Там написано Runtime Error.
Цитата Сообщение от Timama Посмотреть сообщение
это пока что написанный cpp
Скопировал Ваш код, добавил функцию main() - он запускается, таких ошибок нет. Даже экземпляры класса создаются, через оба конструктора.

Видимо какой-то еще код есть?
0
Timama
10 / 10 / 9
Регистрация: 30.03.2016
Сообщений: 163
11.08.2016, 12:22  [ТС] #13
странно, может Visual Studio глючит.
и нет друг мой. мне не льзя и ими пользоваться. если надо копировать что либо, то надо функцию собственно ручно написать.
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
11.08.2016, 12:23 #14
Timama, тогда и пишите функцию побитового копирования строки. data = "UNKNOWN" работает не так, как Вы думаете. Поэтому приложение и падает.
0
Slip.
92 / 92 / 33
Регистрация: 17.03.2012
Сообщений: 536
Завершенные тесты: 1
11.08.2016, 12:23 #15
Цитата Сообщение от pav1uxa Посмотреть сообщение
Скопировал Ваш код, добавил функцию main() - он запускается, таких ошибок нет.
Я же писал выше, что пример использования этого класса не приведен.
Вполне возможно, что в мэйне что-то не так.
0
Timama
10 / 10 / 9
Регистрация: 30.03.2016
Сообщений: 163
11.08.2016, 12:25  [ТС] #16
C++
1
2
3
4
5
6
#include "MString.h"
 
int main(){
    MString a;
    return 0;
}
0
Chainik228
0 / 0 / 2
Регистрация: 18.10.2015
Сообщений: 46
Завершенные тесты: 1
11.08.2016, 12:26 #17
Цитата Сообщение от Timama Посмотреть сообщение
и нет друг мой. мне не льзя и ими пользоваться. если надо копировать что либо, то надо функцию собственно ручно написать.
Сочувствую.

Кликните здесь для просмотра всего текста
А можешь взять и добавить эту штуку. Будет твоим решением.
C++
1
2
#include <cstdlib>
#define allocatemem(lenght) malloc(lenght)
0
Timama
10 / 10 / 9
Регистрация: 30.03.2016
Сообщений: 163
11.08.2016, 12:26  [ТС] #18
Класс должен по функционалу быть похож на string задание на 5 листов, но def c'tor то запускаеться еще в самом начале.
0
Toshkarik
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
11.08.2016, 12:27 #19
Ребят, 3 раз уже повторяюсь, падает приложение при работе деструктора, так как data указывает на строковый литерал, а не на блок памяти, выделенный оператором new[].
1
Chainik228
0 / 0 / 2
Регистрация: 18.10.2015
Сообщений: 46
Завершенные тесты: 1
11.08.2016, 12:29 #20
Тогда лучше пихнуть delete[] data в условие data != NULL?
0
11.08.2016, 12:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2016, 12:29
Привет! Вот еще темы с решениями:

Как исправить ошибку?
D:\C++\az\main.cpp|6|error: expected unqualified-id before '{' token| ||===...

Как исправить ошибку?
Программирую в КБ. Выходит одна ошибка, понятия не имею как исправить....

Как исправить ошибку?
Предупреждение 5 warning C4700: использована неинициализированная локальная...

Как исправить ошибку?
int f(int, int, int); void koorx(int, int, int, int); int nod(int, int);...


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

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

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