3

我正在使用 Visual Studio 2012,我在我的代码中隔离了一个问题,但我无法解决它。在发布模式下运行它时效果很好,但如果我在调试中运行它会出错。代码是:

#include "stdafx.h"

#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/io.hpp>

typedef boost::numeric::ublas::matrix<double> BMT; 

BMT fun()
  { 
  BMT mym;
  mym.resize(3,3);
  for(int i = 0; i<9;++i) mym(i/3,i%3)=i; 
  std::cout << mym << std::endl;
  return mym; 
  }

int main(int argc, char* argv[])
  {
  fun();
  //closing message
  std::cout<<std::endl<<"press enter to exit."<<std::endl;
  std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
  }

调试中的错误如下:

1>------ Build started: Project: myproject, Configuration: Debug x64 ------
1>  myapp.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xmemory(348): error C4996: 'std::_Uninitialized_copy0': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1>          C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xmemory(333) : see declaration of 'std::_Uninitialized_copy0'
1>          C:\thirdparty\vs2012\x64\boost_1_53_0\boost/numeric/ublas/storage.hpp(94) : see reference to function template instantiation '_FwdIt std::uninitialized_copy<const double*,double*>(_InIt,_InIt,_FwdIt)' being compiled
1>          with
1>          [
1>              _FwdIt=double *,
1>              _InIt=const double *
1>          ]
1>          C:\thirdparty\vs2012\x64\boost_1_53_0\boost/numeric/ublas/storage.hpp(89) : while compiling class template member function 'boost::numeric::ublas::unbounded_array<T>::unbounded_array(const boost::numeric::ublas::unbounded_array<T> &)'
1>          with
1>          [
1>              T=double
1>          ]
1>          C:\thirdparty\vs2012\x64\boost_1_53_0\boost/numeric/ublas/matrix.hpp(160) : see reference to function template instantiation 'boost::numeric::ublas::unbounded_array<T>::unbounded_array(const boost::numeric::ublas::unbounded_array<T> &)' being compiled
1>          with
1>          [
1>              T=double
1>          ]
1>          C:\thirdparty\vs2012\x64\boost_1_53_0\boost/numeric/ublas/matrix.hpp(100) : see reference to class template instantiation 'boost::numeric::ublas::unbounded_array<T>' being compiled
1>          with
1>          [
1>              T=double
1>          ]
1>          junkApp1.cpp(10) : see reference to class template instantiation 'boost::numeric::ublas::matrix<T>' being compiled
1>          with
1>          [
1>              T=double
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

你知道问题是什么吗?

4

2 回答 2

2

我在使用 ublas 时遇到了类似的问题。我不确定原因可能是什么,但我想这与 ublas 的写时复制/按需复制优化有关。是否可以选择仅使用定义 -D_SCL_SECURE_NO_WARNINGS 并完成它?我在全球范围内设置了该设置,因为无论如何我认为这些警告中有 90% 是操作系统特定的 BS。

于 2013-06-11T19:01:03.210 回答
1

问题是您正在编译时将警告视为错误。

编辑:Microsoft 已决定不推荐使用 C++(和 C)的某些部分,并且编译器会将这些部分的使用报告为错误,除非定义了 _SCL_SECURE_NO_WARNINGS(分别为 _CRT_SECURE_NO_WARNINGS)。

于 2013-06-11T18:59:32.310 回答