C/C++

Проблема с памятью?

//все работает
//проблема только в 1 месте
Class string
{
private:
char* arr;
public:
string()
{
this->arr = new char[81];
}
string(int size) : string()
{
this->arr = new char[size+1];
}
string(int size,char* sizeString) : string(size)
{
this->arr = new char[size+1];//tut?
for (ptrdiff_t i = 0;i < size;i++)
{
this->arr[i] = sizeString[i];// tut?
}
}
string(const string& object)
{
this->arr = object.arr;
}
~string()
{
delete[]arr;
}
void Input()
{
std::cin.ignore();
std::cin.getline(arr, 80);
}
void Input(int size)
{
string f(size);
std::cin.ignore();
std::cin.getline(arr, size);
}
void Input(int size, char* sizeString)
{
string f(size, sizeString);//tut?
system("pause");
}
void Output()
{
std::cout << arr;
}
};
int main()
{
system("color 0b");
string f;
int size = 0;
int choose = 0;
char* zamenitel = new char[255];
for (;;)
{

system("cls");
std::cout << "1 to play with 1 array\n2 to play with 2 array\n3 to play with 3 array\n4 to show\n5 to leave\n";
scanf_s("%d", &choose);

if (choose == 1)
{
printf_s("Input sentence\n");
f.Input();
}
if (choose == 2)
{
printf("Input size to sentence\n");
scanf_s("%d", &size);
f.Input(size);
}
if (choose == 3)
{
printf("Input sentence\n");
std::cin.ignore();
std::cin.getline(zamenitel, 255);
size = strlen(zamenitel);
f.Input(size, zamenitel);
}
if (choose == 4)
{
f.Output();
}
if (choose ==5)
{
std::cout << "END\n";
break;
}
std::cout << std::endl;
system("pause");
}
}
Немного подправил...

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <conio.h>
using namespace std;
class String {
private:
size_t n;
char* arr;
size_t m;
public:
String() : n(80U), arr(new char[n]), m(0U) {}
String(int size) : n(size), arr(new char[size]), m(0U) {}
String(const char* str) {
auto i = 0U;
while (str[++i]);
m = n = i;
arr = new char[n];
}
String(const String& str) : n(str.n) , m(str.n) {
for (auto i = 0U; i < m; ++i) arr[i] = str.arr[i];
}
String(char* begin, char* end) : n(end - begin), arr(new char[n]), m(n) {
for (auto it = arr, beg = begin; beg != end; ++it, ++beg)
*it = *beg;
}
String& operator=(const String& str) {
if (str != *this) {
delete[] arr;
n = str.n;
m = str.m;
arr = new char[n];
for (auto i = 0U; i < m; ++i) arr[i] = str.arr[i];
}
return *this;
}
~String() {
if (arr) {
delete[] arr;
arr = nullptr;
}
}
bool empty()const {
return m == 0;
}
size_t size()const {
return m;
}
size_t capacity()const {
return n;
}
friend bool operator==(const String& a, const String& b) {
return strcmp(a.arr, b.arr) == 0;
}
friend bool operator<(const String& a, const String& b) {
return strcmp(a.arr, b.arr) < 0;
}
friend bool operator>(const String& a, const String& b) {
return strcmp(a.arr, b.arr) > 0;
}
friend bool operator!=(const String& a, const String& b) {
return !(a == b);
}
friend bool operator<=(const String& a, const String& b) {
return a == b || a < b;
}
friend bool operator>=(const String& a, const String& b) {
return a == b || a > b;
}
friend ostream& operator<<(ostream& out, const String& str) {
for (auto i = 0U; i < str.m; ++i) {
auto ch = str.arr[i];
if (ch != '\n') out.put(str.arr[i]);
else break;
}
return out;
}
friend istream& operator>>(istream& inp, String& str) {
auto i = 0U;
for (; i < str.n; ++i) {
auto ch = inp.get();
if (ch == '\n' || ch == ' ') break;
str.arr[i] = ch;
++str.m;
}
while (i >= str.n) {
auto tmp = new char[str.n << 1U];
strncpy(tmp, str.arr, str.n);
delete[] str.arr;
str.n <<= 1;
str.arr = new char[str.n];
strncpy(str.arr, tmp, str.n);
for (; i < str.n; ++i) {
auto ch = inp.get();
if (ch == ' ' || ch == '\n') break;
str.arr[i] = ch;
++str.m;
}
delete[] tmp;
}
return inp;
}
};
void flush() {
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
istream& getline(istream& inp, String& str) {
auto n = 1024U;
auto m = 0U;
auto box = new char[n];
auto i = 0U;
for (; i < n; ++i) {
auto ch = cin.get();
if (ch == '\n') {
box[i] = 0;
break;
}
box[i] = ch;
++m;
}
while (i >= n) {
auto tmp = new char[n << 1U];
strncpy(tmp, box, n);
delete[] box;
n <<= 1;
box = new char[n];
strncpy(box, tmp, m);
for (; i < n; ++i) {
auto ch = cin.get();
if (ch == '\n') {
box[i] = 0;
break;
}
box[i] = ch;
++m;
}
}
str = String(box, box + m);
delete[] box;
return inp;
}
int main() {
cout << "Word: ";
String word;
cin >> word;
cout << "Output: " << word << '\n';
flush();
cout << "Line: ";
String line;
getline(cin, line);
cout << "Output: " << line << '\n';
system("pause > nul");
}
Толик Королев
Толик Королев
81 222
Лучший ответ
Bobur Babash0V Совсем немножко подправил... Операторы перегрузил ну и так по мелочи!)))
Даниил Кумушбаев немножечко подправили))
уже разобрался с ошибкой
но, премного благодарен!
интересно разбирать ваши коды!
Тут https://rextester.com/UOM90068 проблема исправлена (или не проявляется?), но осталось много других.
Даниил Кумушбаев вы ничего не исправляли...
Вот твой шедевр, работающий:

#include<iostream>
using namespace std;

class string2 {
private: char* arr;
public: string2()
{
this->arr = new char[81];
}
string2(int size) : string2() {
this->arr = new char[size+1];
}
string2(int size,char* sizeString) : string2(size)
{
this->arr = new char[size+1];
//tut?
for (ptrdiff_t i = 0;i < size;i++)
{
this->arr[i] = sizeString[i];
// tut?
}
}
string2(const string2& object)
{
this->arr = object.arr;
} ~string2()
{ delete[]arr;
}
void Input()
{
std::cin.ignore();
std::cin.getline(arr, 80);
}
void Input(int size)
{
string2 f(size);
std::cin.ignore();
std::cin.getline(arr, size);
}
void Input(int size, char* sizeString)
{
string2 f(size, sizeString);
//tut?
//system("pause");
}
void Output()
{
std::cout << arr; }
};

int main()
{
//system("color 0b");
string2 f;
int size = 0;
int choose = 0;
char* zamenitel = new char[255];
for (;;)
{
//system("cls");
std::cout << "1 to play with 1 array\n2 to play with 2 array\n3 to play with 3 array\n4 to show\n5 to leave\n";
scanf("%d", &choose);
if (choose == 1)
{
printf("Input sentence\n");
f.Input(); }
if (choose == 2)
{
printf("Input size to sentence\n");
scanf("%d", &size);
f.Input(size);
}
if (choose == 3)
{ printf("Input sentence\n");
std::cin.ignore();
std::cin.getline(zamenitel, 255);
size = strlen(zamenitel);
f.Input(size, zamenitel);
}
if (choose == 4) { f.Output();
}
if (choose ==5)
{ std::cout << "END\n"; break; }
std::cout << std::endl;
//system("pause");
} }
Николай Сараев
Николай Сараев
37 945
Даниил Кумушбаев он не исправлен
вы отправили его не изменив
...
Андрей Шишов Евгений Высочин,
вывод в 3 случае
у массива нет '\0'
и он начинает уходить в пустоту
а как исправить понятия не имею
Андрей Шишов не заменитель а sizeString
string(int size,char* sizeString) : string(size)
{
this->arr = new char[size+1];//tut?
for (ptrdiff_t i = 0;i < size;i++)
{
this->arr[i] = sizeString[i];// tut?
}
}
Это как у вас голова работает что вы такой длинный код пишите, мне читать даже его весь лень.