-
Notifications
You must be signed in to change notification settings - Fork 167
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
変換先バッファ確保の new で例外処理を行わないように std::nothrow 指定追加 #287
Conversation
コードを触るより先に、どうあるべきかを話たほうが良さそうな話題です。 ぼくの認識
このへん詳しくはないので、用語は間違ってるかも知れません。 |
そういえば #53 がありましたね。そこでちゃんと議論した方が良いんでしょうか? 下記のプログラムを書いて調べてみました。 #include <stdio.h>
#include <new>
#include <iostream>
void test_new(size_t sz)
{
std::cout << "sz : " << sz/1024/1024 << "MiB" << std::endl;
// try catch 使用
{
char* p1 = nullptr;
char* p2 = nullptr;
try {
p1 = new char[sz];
} catch (std::bad_alloc& e) {
std::cout << "p1: " << e.what() << std::endl;
}
try {
p2 = new char[sz];
} catch (std::bad_alloc& e) {
std::cout << "p2: " << e.what() << std::endl;
}
delete[] p1;
delete[] p2;
}
// nothrow 使用
{
char* p1 = nullptr;
char* p2 = nullptr;
p1 = new (std::nothrow) char[sz];
if (!p1) {
std::cout << "p1 new failed." << std::endl;
}
p2 = new (std::nothrow) char[sz];
if (!p2) {
std::cout << "p2 new failed." << std::endl;
}
delete[] p1;
delete[] p2;
}
std::cout << std::endl;
}
int main(int argc, char* argv[])
{
test_new(1U << 29);
test_new(1U << 30);
test_new(1U << 31);
if (sizeof(size_t) == 8) {
test_new((size_t)(1ULL << 32));
test_new((size_t)(1ULL << 33));
test_new((size_t)(1ULL << 34));
test_new((size_t)(1ULL << 35));
}
return 0;
} x86 Release での実行結果
x64 Release での実行結果
|
という事で https://en.cppreference.com/w/cpp/memory/new/nothrow あとこのPRの目的としては一部のコードの記述をシンプルにする事で、(メモリ確保失敗時の挙動を踏まえて)全般的に new でメモリ確保している箇所の記述を直すつもりはありません。それは大変そうなので…。 |
delete[] p1; |
ご指摘ありがとうございます。。 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTMです。
変更前後で変数名、型、要求サイズに差異がないことを確認しました。
チェック資材 |
とくに文句も出てないのでマージしちゃいました。 |
変換先バッファ確保の new で例外処理を行わないように std::nothrow 指定追加
new で例外が起きたら catch で捕まえてポインタに NULL を設定する記述を std::nothrow 指定するように置き換えました。
new している箇所は他にもいっぱいありますが、それらについてどうしてるのかは良く分かっていません。