[英]C++ Segmentation Fault when Assigning Class Member Variable
我在名稱空間“ TEST_NS”下的“測試”類中有一個函數“ testfunc()”。
在主程序中,我創建了一個指向“ Test”的指針,並希望指向“ testfunc()”函數。 沒問題...
我將私有變量“ foo”聲明為“ Test”的成員,並且“ testfunc()”函數嘗試更改該變量。 這導致分段錯誤。
為什么會這樣?
我創建了一個簡單的示例來展示我的問題。 當我設置foo = 1;
時發生段錯誤foo = 1;
在test.cpp中
這些是文件:
main.cpp:
#include <iostream>
#include "test.h"
using namespace std;
int main () {
TEST_NS::Test * test;
test->testfunc();
return 0;
}
test.h:
#include <iostream>
namespace TEST_NS
{
class Test
{
int foo;
public:
Test();
~Test();
void testfunc();
};
}
test.cpp:
#include <iostream>
#include "test.h"
using namespace TEST_NS;
Test::Test() { }
Test::~Test() { }
void Test::testfunc()
{
std::cout << "This is testfunc()!" << std::endl;
foo = 1;
}
該代碼使用
g++ main.cpp test.cpp -o test
並與
./test
您需要實例化您的類的對象。 嘗試
TEST_NS::Test * test = new TEST_NS::Test();
test->testfunc();
您的main()
函數需要更改; 編寫它的首選方式是
int main () {
TEST_NS::Test test;
test.testfunc();
return 0;
}
如果您確實要使用指針(為什么?),則應編寫:
int main () {
auto test = new TEST_NS::Test();
test->testfunc();
delete test;
return 0;
}
注意添加delete test;
。 但這是一種不好的做法,因為它可能導致內存泄漏,尤其是在添加更多代碼時(或者如果testfunc()
引發異常)。 如果你真的需要使用指針,這是更好的使用std::unique_ptr<>
int main () {
auto test = std::make_unique<TEST_NS::Test>();
test->testfunc();
return 0;
}
請注意,這也擺脫了通常是一個好主意的顯式new
以及必須添加的delete
; 另外,它是異常安全的。
在現代C ++中,幾乎沒有理由“裸體” new
或delete
。 請注意,您仍然可以使用get()
獲得“原始”指針,盡管首選取消引用
void testfunc(TEST_NS::Test& test)
{
test.testfunc();
}
// ...
testfunc(*test);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.