대입 함수 편
1. 할당 함수 얕은 복사 문제:
먼저 코드를 보십시오://base.h
#ifndef BASE_H
#define BASE_H
#include
class Base
{
private:
ptr;
size_t len;
public:
Base(const char *val);
~Base();
void print() const;
void init(const char *val);
};
//base.cpp
#include
#include
using namespace std;
Base::Base(const char *val) : ptr(val),len(0)
{
init(val);
}
void Base::init(const char *val)
{
if(val)
{
len = strlen(val);
ptr = new char[len + 1];
bzero(ptr,len + 1);
strncpy(ptr,val,len);
}
}
Base::~Base()
{
if(ptr)
{
delete ptr;
ptr = NULL;
}
len = 0;
}
void Base::print() const
{
std::cout << "ptr: " << (ptr ? ptr :" ") << " len:" << len << std::endl;
}
int main()
{
Base base1("1");
base1.print();
//
{
Base base2("2");
base2.print();
base1 = base2;
}
base1.print();
return 0
}
위 코드를 보니 자기가 상상했던 것과 다른 것 같아. 왜?얕은 복사로 인해 베이스 1 대상의 ptr가 가리키는 메모리가 영원히 잃어버렸다. 그리고 베이스 1의 ptr는 베이스 2의 ptr(실제로는 방출되었다)를 가리키고 얕은 복사는 시스템 내에 만들어진 형식의 데이터에만 적합하다. 이런 상황을 방지하기 위해 우리는 부치 함수에서 깊은 복사(이른바 깊은 복사란 복사 대상의 모든 바이트)를 실현해야 한다. 코드는 다음과 같다.//base.h
Base& operator= (const Base& base);
inline const char* getPrt() const
{
return ptr;
}
//base.cpp
Base& operator= (const Base& base)
{
//
if(&base == this)
{
return *this;
}
if(ptr)
{
delete ptr;
ptr = NULL;
len = 0;
}
init(base.getPtr());
return *this;
}
위에서 우리는 부치 함수를 실현했고 운행해 보니 결과가 우리가 예상한 것과 같다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
//base.h
#ifndef BASE_H
#define BASE_H
#include
class Base
{
private:
ptr;
size_t len;
public:
Base(const char *val);
~Base();
void print() const;
void init(const char *val);
};
//base.cpp
#include
#include
using namespace std;
Base::Base(const char *val) : ptr(val),len(0)
{
init(val);
}
void Base::init(const char *val)
{
if(val)
{
len = strlen(val);
ptr = new char[len + 1];
bzero(ptr,len + 1);
strncpy(ptr,val,len);
}
}
Base::~Base()
{
if(ptr)
{
delete ptr;
ptr = NULL;
}
len = 0;
}
void Base::print() const
{
std::cout << "ptr: " << (ptr ? ptr :" ") << " len:" << len << std::endl;
}
int main()
{
Base base1("1");
base1.print();
//
{
Base base2("2");
base2.print();
base1 = base2;
}
base1.print();
return 0
}
//base.h
Base& operator= (const Base& base);
inline const char* getPrt() const
{
return ptr;
}
//base.cpp
Base& operator= (const Base& base)
{
//
if(&base == this)
{
return *this;
}
if(ptr)
{
delete ptr;
ptr = NULL;
len = 0;
}
init(base.getPtr());
return *this;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.