C4996エラーについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ruif
記事: 9
登録日時: 4年前

C4996エラーについて

#1

投稿記事 by ruif » 4年前

こんにちは。現在ロベールのC++入門講座という本で勉強しています。
その中にあったサンプルコードを書いてコンパイルしたところ、下記のエラーが発生してしまいます。
本と見比べても間違えているところが見つからず、何がエラーかがわかりません。
理由と対処方法を教えていただけないでしょうか。
使用環境は Windows8 で、 Micorsoft Visual Studio 2015 です。


IntArray.h

コード:

#ifndef INTARRAY_H_20070101_1529_80AHFDJI_INCLUDE_
#define INTARRAY_H_20070101_1529_80AHFDJI_INCLUDE_

class IntArray{
public:
	IntArray(const IntArray& other); // コピーイントラクタ


public:
	// コントラクタ・デストラクタ
	IntArray(int size);
	~IntArray();

public:
	// メンバへのアクセス関数
	int Get(int i);
	void Set(int i, int value);

private:
	// インデックスのチェック
	void CheckIndex(int i);

public:
	// 配列のサイズを返す
	int Size();

private:
	int* m_array; // 動的配列
	int  m_size;  // 配列の要素数
};

#endif // #ifndef INTARRAY_H_20070101_1529_80AHFDJI_INCLUDE_

IntArray.cpp

コード:

#include "IntArray.h"
#include <iostream>
#include <algorithm>
#include <cstdlib>
using namespace std;

// コピーインストラクタ
IntArray::IntArray(const IntArray& other) {
	m_array = new int[other.m_size];
	m_size = other.m_size;

	copy(other.m_array, other.m_array + m_size, m_array);
	cout << "コピーイントラクタが呼ばれました。" << endl;
}

// コンストラクタ
IntArray::IntArray(int size) {
	m_array = new int[size];
	m_size = size;

	cout << "コントラクタが呼ばれました。"
		<< "要素数は " << m_size << " です。" << endl;
}

// デストラクタ
IntArray::~IntArray() {
	delete[] m_array;

	cout << "デストラクタが呼ばれました。"
		<< "要素数は " << m_size << " でした。" << endl;
}

// メンバへのアクセス関数
int IntArray::Get(int i) {
	CheckIndex(i);
	return m_array[i];
}

void IntArray::Set(int i, int value) {
	CheckIndex(i);
	m_array[i] = value;
}

// インデックスのチェック
void IntArray::CheckIndex(int i) {
	if (0 <= i && i < m_size) {
		// インデックスは正常です
	}
	else {
		cout << "インデックスが不正です!" << endl
			<< "値 : " << i << endl;
		exit(EXIT_FAILURE);
	}
}

// 配列のサイズを返す
int IntArray::Size() {
	return m_size;
}

void Viss(int num) {
	cout << "Viss : No. " << num << endl;
}
Copy1.cpp

コード:

#include "IntArray.h"
#include <iostream>
using namespace std;

void Viss(int num) {
	cout << "Viss : No. " << num << endl;
}

void Show(IntArray array) {
	Viss(2);

	for (int i = 0; i < array.Size(); ++i) {
		cout << array.Get(i) << ' ';
	}
	cout << endl;

	Viss(3);
}

int main() {
	IntArray array0to9(10);

	for (int i = 0; i < array0to9.Size(); ++i) {
		array0to9.Set(i, i);
	}

	Viss(1);
	Show(array0to9);
	Viss(4);
}
エラー C4996 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' Array c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 2230

よろしくお願いします。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: C4996エラーについて

#2

投稿記事 by みけCAT » 4年前

コンパイラの不都合だと思います。
テストしていませんが、GCC (g++) など、他のコンパイラを使えばエラーを回避できるかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: C4996エラーについて

#3

投稿記事 by へにっくす » 4年前

これですね。

コンパイラの警告 (レベル 3) C4996
std::copyを使ったサンプルがありますよ(回避策も記述されています)。
written by へにっくす

ruif
記事: 9
登録日時: 4年前

Re: C4996エラーについて

#4

投稿記事 by ruif » 4年前

>>みけCATさん
今後もこれに似たプログラムをVSでするので、別のコンパイラは使わないようにしています。
わざわざ回答をいただいたのにすいません。

ruif
記事: 9
登録日時: 4年前

Re: C4996エラーについて

#5

投稿記事 by ruif » 4年前

>>へにっくすさん
回答ありがとうございます!
IntArray.cpp の最初の部分に #define _SCL_SECURE_NO_WARNINGS を入れ、
void Viss(int num) {
cout << "Viss : No. " << num << endl;
}
を消したらできました!

お二人方、ほんとうにありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る