簡體   English   中英

初始化 char* a = new char[size] 不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM