簡體   English   中英

分配類成員變量時出現C ++分段錯誤

[英]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 ++中,幾乎沒有理由“裸體” newdelete 請注意,您仍然可以使用get()獲得“原始”指針,盡管首選取消引用

 void testfunc(TEST_NS::Test& test)
 {
    test.testfunc();
 }
 // ...
 testfunc(*test);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM