2013-08-27 94 views
0

我有一些麻煩,返回一個空的向量,我不期待。請有人幫忙解釋一下!C++ Segfault當返回一個空向量包含向量

這是違規的部分: - 我知道回報是相同的,它是一個現在的佔位符。

std::vector<std::vector<double> > PerceptronLayer::calculateLayer() { 
    std::vector<std::vector<double> > result; 

    if (vPerceptrons.size() == 0) { 
     return result; 
    } 

    return result; 
} 

但是如果我要確保載體具有一定的價值,通過設置一些虛擬的數據,該函數返回我期望的那樣。

std::vector<double> val; 
    val.push_back(1.0); 
    result.push_back(val); 

GDB輸出:

Program received signal SIGSEGV, Segmentation fault. 
0x000000000040ba60 in std::vector<double, std::allocator<double> >::operator[]  (this=0x0, __n=0) 
at /usr/include/c++/4.7/bits/stl_vector.h:751 
751  { return *(this->_M_impl._M_start + __n); } 

我能不能讓它空上運行的數據保護功能,但我不禁覺得我在這裏失去了一些東西根本。

謝謝, 喬

+0

你能向我們展示完整的代碼?很難說你發佈的代碼有什麼問題。 – Mahesh

+2

使用GDB命令'up'來通過調用堆棧。它看起來像你的代碼中的某個地方,返回值被認爲是非空的。 – timrau

+0

啊,好的。是的,我認爲我發現了它。我已經返回到:std :: vector > results = pl.calculateLayer();如果我將它分成兩行,它可以工作:\t \t std :: vector > results; \t \t results = pl.calculateLayer(); – joeButler

回答

0

通過固定 - 見問題的詳細評論。

最初我從發佈的函數返回來設置一個新的向量。它不喜歡。

std::vector<std::vector<double> > results = pl.calculateLayer(); 

如果我將這個相同的代碼分成兩行,它按預期工作。我猜std :: vector的構造函數/副本不喜歡被賦予這個。

std::vector<std::vector<double> > results; 
results = pl.calculateLayer(); 
+0

我用gcc 4.1.2在visual studio 2010和Centos 5.9 x86上試了類似的代碼(我在我的筆記本電腦上安裝了一個虛擬盒來驗證這一點),但一切都很好。複製構造函數和賦值運算符的重載沒有這個意義上的重要區別。我可以知道你使用的平臺和編譯器嗎? – JackyZhu

+0

gcc -v 使用內置規格。 目標:x86_64-linux-gnu 配置:../src/configure -v --with-pkgversion ='Ubuntu/Linaro 4.4.7-2ubuntu1'--with-bugurl = file:/// usr/share /doc/gcc-4.4/README.Bugs --enable-languages = c,C++,fortran --prefix =/usr --program-suffix = -4.4 --enable-shared --enable-linker-build-id - -with-system-zlib --libexecdir =/usr/lib --without-included-gettext --enable-threads = posix --with-gxx-include-dir =/usr/include/C++/4。4 --libdir =/usr/lib --enable-nls --with-sysroot =/--enable-clocale = gnu --enable-libstdcxx - debug – joeButler

+0

--disable-werror --with-arch-32 = i686 --with-tune = generic --enable-checking = release --build = x86_64-linux-gnu --host = x86_64-linux-gnu --target = x86_64-linux-gnu – joeButler

相關問題