野指針その他のc++問題に関する小結がある(一)

7134 ワード

1.野ポインタ
野ポインタは、削除されたオブジェクトまたは制限されたメモリ領域へのアクセスを申請していないポインタを指します.空のポインタとは異なり,野ポインタはNULL回避であるか否かを簡単に判断することはできず,良好なプログラミング習慣を身につけることで極力減らすしかない.野ポインタを操作するとプログラムエラーが発生しやすい.今回のテーマの野指針に関する問題は私を長い間デバッグさせた.タイトルは以下の通りです.完全な書類は後で提出します.C++のクラスをCで真似する方法を学びます:How do you implement a class in C?与えられたファイルに基づいてCの「Date class」を実現する.問題の中で2つのファイルを書いて、3番目のファイルの実現を要求します.
//file 1
#include "date.h"
#include 
#include 

void TestDate(Date* date, int after, int before) {
  printf("Year: %d
"
, GetYear(date)); printf("Month: %d
"
, GetMonth(date)); printf("Day: %d
"
, GetDay(date)); char* date_string = GetDateString(date); printf("Formatted: %s
"
, date_string); DestroyDateString(&date_string); assert(date_string == NULL); DestroyDateString(&date_string); IncreaseDate(date); date_string = GetDateString(date); printf("1 day later: %s
"
, date_string); DestroyDateString(&date_string); int i; for (i = 0; i < after; ++i) { IncreaseDate(date); } date_string = GetDateString(date); printf("Another %d day(s) later: %s
"
, after, date_string); DestroyDateString(&date_string); for (i = 0; i < before; ++i) { DecreaseDate(date); } date_string = GetDateString(date); printf("Another %d day(s) earlier: %s
"
, before, date_string); DestroyDateString(&date_string); } int main() { int year, month, day; int after, before; scanf("%d%d%d%d%d", &year, &month, &day, &after, &before); Date* date1 = CreateDate(year, month, day); assert(sizeof(*date1) == sizeof(Date)); Date* date2 = CopyDate(date1); assert(date1 != date2); assert(date1->month == date2->month); SetDate(date1, year + 1, month, day); SetYear(date1, year); SetMonth(date1, month); SetDay(date1, day); TestDate(date1, after, before); DestroyDate(&date1); DestroyDate(&date2); assert(date1 == NULL); DestroyDate(&date2); return 0; } /* One probable test case: 1900 2 28 365 366 Year: 1900 Month: 2 Day: 28 Formatted: 1900-02-28 1 day later: 1900-03-01 Another 365 day(s) later: 1901-03-01 Another 366 day(s) earlier: 1900-02-28 */
//file 2
#ifndef DATE_H_
#define DATE_H_

typedef struct {
  int year, month, day;
} Date;

Date* CreateDate(int year, int month, int day);
void DestroyDate(Date** p);
Date* CopyDate(const Date* date);

int GetYear(const Date* date);
int GetMonth(const Date* date);
int GetDay(const Date* date);
void SetYear(Date* date, int year);
void SetMonth(Date* date, int month);
void SetDay(Date* date, int day);
void SetDate(Date* date, int year, int month, int day);

char* GetDateString(const Date* date);
void DestroyDateString(char** p);

void IncreaseDate(Date* date);
void DecreaseDate(Date* date);

#endif

ここの3番目の書類は自分で書きます.私のコードを添付
`ここと2017.3.2オープン前」//my solution
  • ここで注意すべき野ポインタに関する点.

  • 1.free後もptr=NULLを使用する必要があります.と入力します.2.valgrindでLeak_をプロンプトDefinitelyLost. 3.注意ここではポインタのポインタを使うことで野ポインタの問題を回避します.
    2.thisについて
    なぜか、学校ojでメンバーfunctionでprivate dataメンバーを使う必要がある場合は無理にthisを使います.普段から覚えているでしょう.
    今週は難しい知識点が多くなくて、これからブログの幅が増えます.loading以降は毎週更新され、学校ojのテーマは、意図者が自分で取ります.アドレス:http://download.csdn.net/detail/ralphfjy/9763266