[英]initializing char* a = new char[size] does not work
我在初始化char* a = new char[size]
遇到問題。 這是我的代碼。
class Practice
{
public:
Practice(const char* a);
~Practice();
const char* getString() const;
private:
char* mString;
int mSize;
};
#include "Practice.h"
Practice::Practice(const char * a)
:mSize(0)
,mString(nullptr)
{
while (a[mSize] != '\0')
{
mSize++;
}
mString = new char[mSize];
for (int i = 0; i < mSize; i++)
{
mString[i] = a[i];
}
}
Practice::~Practice()
{
delete[] mString;
}
const char* Practice::getString() const
{
return mString;
}
int main()
{
Practice p("Hello");
std::cout << p.getString() << std::endl;
return 0;
}
我預計結果是Hello
。
但結果就像Hello²²²²▌▌▌▌▌▌▌■a%{▌
。
我以為我通過mString = new char[mSize]
初始化了mString
成員變量。 但它並沒有像我想象的那樣工作。
任何人都可以啟發我我的代碼有什么問題並修復它嗎?
mString
不是以 NUL 結尾的。
您正在檢查\\0
a
構造函數參數。 但是您沒有分配mString
將相同的\\0
放在那里,並且不要從a
復制\\0
。
因此,生成的mString
未正確以 NULL 結尾,並且會在結束后讀取。
超出分配結束的讀取是未定義的行為。 在特定情況下,很可能mString
會輸出直到某個意外為零,或者會發生崩潰。
while (a[mSize] != '\\0') { mSize++; }
這將mSize
設置mSize
等於a
的長度,不包括終止'\\0'
。 您應該在副本中包含終止符:
while (a[mSize++])
{
}
或者干脆:
mSize = strlen(a) + 1;
您不是空終止您的mString
數據,但是當您將其傳遞給std::cout
時,它期望以空終止。 如果沒有那個終止符, std::cout
會讀入周圍的內存,直到遇到隨機空字節(或因讀取訪問錯誤而崩潰)。 這就是為什么您會在數據之后看到std::cout
輸出隨機垃圾。
您也沒有遵循3/5/0 規則,因為您缺少默認構造函數、復制和移動構造函數以及復制和移動賦值運算符。
嘗試這個:
class Practice
{
public:
Practice(const char* a = nullptr);
Practice(const Practice &src);
Practice(Practice &&src);
~Practice();
Practice& operator=(Practice src);
const char* getString() const;
private:
char* mString;
int mSize;
};
#include "Practice.h"
#include <utility>
Practice::Practice(const char * a)
: mSize(0)
, mString(nullptr)
{
if (a)
{
while (a[mSize] != '\0')
{
++mSize;
}
}
mString = new char[mSize + 1];
for (int i = 0; i < mSize; ++i)
{
mString[i] = a[i];
}
mString[mSize] = '\0';
}
Practice::Practice(const Practice &src)
: mSize(src.mSize)
, mString(nullptr)
{
mString = new char[mSize + 1];
for (int i = 0; i < mSize; ++i)
{
mString[i] = src.mString[i];
}
mString[mSize] = '\0';
}
Practice::Practice(Practice &&src)
: mSize(src.mSize)
, mString(src.mString)
{
src.mString = nullptr;
src.mSize = 0;
}
Practice::~Practice()
{
delete[] mString;
}
Practice& Practice::operator=(Practice src)
{
std::swap(mString, src.mString);
std::swap(mSize, src.mSize);
return *this;
}
const char* Practice::getString() const
{
return mString;
}
#include <iostream>
#include "Practice.h"
int main()
{
Practice p("Hello");
std::cout << p.getString() << std::endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.