Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

То ли лыжи не едут, или как бороться с MS VS2005

585
10 июля 2006 года
honeybeer
297 / / 06.09.2004
Дело просто, есть код:
.h
Код:
#pragma once
#include <stdlib.h>   // For _MAX_PATH definition
#include <stdio.h>
#include <malloc.h>
#include <string.h>

class TString
{
private:
    char *inner;
    int count;
public:
    TString(){ count = 0; }
    TString(const char *value);
    ~TString(){ delete inner; }
    friend TString operator+(TString &arg1, TString &arg2);
};


и .cpp

 
Код:
#include "TString.h"

TString::TString(const char *value)
{
    count = 0;
    const char *ptr = value;
    while(*ptr++) ++count;
    inner = new char(count + 1);
    strcpy(inner, value);
}


где косяк, ткните носом, ибо моск уже в отключке
725
10 июля 2006 года
UnErase
190 / / 08.06.2006
А чего сам VC++ пишет? Какую ошибку?
585
10 июля 2006 года
honeybeer
297 / / 06.09.2004
Windows has triggered a breakpoint in tstring.exe.

This may be due to a corruption of the heap, and indicates a bug in tstring.exe or any of the DLLs it has loaded.

The output window may have more diagnostic information

причем выскакивает в деструкторе
725
10 июля 2006 года
UnErase
190 / / 08.06.2006
Что-то либо я не понимаю, либо у тебя ошибка...

В конструкторе, указатель inner не инициализируется (память не выделяется), а в деструкторе ты освобождаешь память под этот указатель! Это как?
585
10 июля 2006 года
honeybeer
297 / / 06.09.2004
ну здрасте... а это что
 
Код:
TString::TString(const char *value)
{
    count = 0;
    const char *ptr = value;
    while(*ptr++) ++count;
    inner = new char(count + 1);
    strcpy(inner, value);
}
725
10 июля 2006 года
UnErase
190 / / 08.06.2006
А если будет вызван первый конструктор TString::TString();

Ошибка в инициализации! Я не знаю как ты в коде этот класс юзаешь, и как реализована перегрузка оператора +, сама функция.

Наверное delete не понимает сколько памяти освобождать, поэтому выдает ошибку! У меня такое было кода я динамический массив делал, без конкретной размерности...

Цитата:
while(*ptr++) ++count;

А этой строкой ты количество символов узнаешь? А не пробовал strlen(...) заюзать, и в качестве параметра указать указатель value?

585
10 июля 2006 года
honeybeer
297 / / 06.09.2004
Ну скажем, delete корректно обрабатывает и попытки удаления неинициализированных указателей.
Но в данном контексте это мимо кассы, т.к. объект создается параметризированным конструктором аля.
 
Код:
TString inst("blah-blah");

Память выделяется, строка копируется, при вызове деструктора - борода.
Этот класс - не реальной задачи, но я желаю разобраться в этой ситуевине.

strlen - не суть важно
324
10 июля 2006 года
AndreySar
532 / / 01.08.2004
В деструкторе:
 
Код:
delete[] inner;
725
10 июля 2006 года
UnErase
190 / / 08.06.2006
Короче вот решение твоей проблемы:

 
Код:
TString::TString(const char *value)
{
    count = 0;
    const char *ptr = value;
    while(*ptr++) ++count;
    inner = new char[count + 1];
    strcpy(inner, value);
}


Надо в квадратных скобках писать...
585
10 июля 2006 года
honeybeer
297 / / 06.09.2004
Бред конечно, но с инициализацией с [] работает. Спасибо...
3
10 июля 2006 года
Green
4.8K / / 20.01.2000
Ну вообще-то это не бред, просто надо понимать разницу между заданием размерности массива и инициализацией и бороться на да не с MS VS2005, а с любым учебником по С++.

Кстати, почему while(*ptr++) ++count; а не strlen(ptr) ?
585
11 июля 2006 года
honeybeer
297 / / 06.09.2004
() и []... торможу не по детски...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог