前置き
次のコードをWandboxのgcc6.3.0でビルド・実行したところ、セグフォが発生しました。
C++
1#include <cstdlib> 2#include <iostream> 3 4void* operator new(std::size_t size) { 5 void* ptr = std::malloc(size); 6 if(ptr == nullptr) { 7 throw std::bad_alloc(); 8 } 9 10 std::cout << "reached\n"; 11 return ptr; 12} 13 14int main(void) { 15 auto p = new int; 16 delete(p); 17 18 return 0; 19}
しかし、同じコードを手元の環境でコンパイル・実行すると、エラーなく実行されます。
C:...>ver Microsoft Windows [Version 10.0.16299.371] C:...>g++ --version g++ (MinGW.org GCC-6.3.0-1) 6.3.0 Copyright (C) 2016 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. C:...>type prog.cc #include <cstdlib> #include <iostream> void* operator new(std::size_t size) { void* ptr = std::malloc(size); if(ptr == nullptr) { throw std::bad_alloc(); } std::cout << "reached\n"; return ptr; } int main(void) { auto p = new int; delete(p); return 0; } C:...>g++ prog.cc -Wall -Wextra -std=gnu++17 -o prog C:...>prog.exe reached
なお、
std::cout << "reached\n";
をコメントアウトすると、セグフォは発生しません。- Wandbox + clang の場合は、同じコードでもセグフォは発生しません。
本題
- 上手く動作しないのは、コードに問題があるからなのでしょうか?
- もしそうであれば、どうしてなのでしょうか?
試したこと
試しにcoutをprintfに置き換えてみたところ、セグフォは発生しませんでした。
しかし、Wandboxと手元の環境では動作が異なりました。
Wandboxでの実行結果
reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached reached
手元での実行結果 (環境は前述したとおり)
reached
Wandboxでは裏でいろいろ動いているようですね。
**『オープンソースなんだから、自分で読めよ』**とか、
**『直接イシュー投げろよ』**とか言われてしまったらそれまでですが...
コードに問題があるのか、環境に問題があるのかわからないため、質問させていただきました。
なにか質問に不足があればご指摘のほどよろしくお願いします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/01 09:43
2018/05/04 08:10
2018/05/04 08:34