我意识到在调用vector.clear()哪个持有共享指针之后,shared_ptr没有释放拥有的对象的析构函数.
代码示例如下所示.即使vector.clear()被调用,在共享指针之后调用的析构函数超出了范围.我的问题是 - 我是否必须通过重置它们来手动删除向量内的所有智能指针?有没有更简单的方法可以提供建议?
Output :
constructor
I am here
destructor
Code:
#include <vector>
#include <iostream>
#include <memory>
using namespace std;
class A
{
public:
A(){cout << "constructor" << endl;};
~A(){cout << "destructor" << endl;};
};
int main( )
{
shared_ptr<A> sharedptr (new A);
std::vector<shared_ptr<A> > test;
test.push_back(sharedptr);
test.clear();
cout << "I am here" << endl;
}
Run Code Online (Sandbox Code Playgroud) 我可以得到主题替代名称
X509_NAME_get_text_by_NID(X509_get_subject_name(x), NID_subject_alt_name, hc->https_domain_name, 256)
Run Code Online (Sandbox Code Playgroud)
使用相同的方法将2.参数更改为NID_issuer_alt_name我希望获得发行者名称;
X509_NAME_get_text_by_NID(X509_get_subject_name(x), NID_issuer_alt_name, hc->https_ca_name, 256);
Run Code Online (Sandbox Code Playgroud)
但相反,我得到一个空字符串.如何正确检索发行人替代名称?
我按照这个链接中的步骤操作, 并设法从命令提示符调试从我的Windows机器中驻留在linux主机中的二进制文件.
我在linux中有gdbserver,我在windows中使用mingw安装了gdb.正如我所说,我可以在Windows中提示"目标远程xxxx:10000测试"命令并调试我的测试应用程序.
我的问题是我不能用eclipse gui做同样的事情,在我看来它有按钮的音调,选项,但它们对我没有任何意义.
我选择debug_configurations - > C/C++远程应用程序(唯一一个允许我输入linux机器的ip/port),在"Main"选项卡中连接我正在输入我的linux ip.在Debugger选项卡下的同一菜单中,我输入了我的窗口的gdb路径和gdbserver端口.
在完成所有这些之后,我相信我已经为eclipse提供了足够的信息来连接gdb服务器,但它永远不够用于eclipse.我通过使用--debug启动gdbserver来检查gdbserver日志,gdbserver永远不会被触发,它不会写入一行日志.Eclipse甚至不会启动连接.但相反,它给我一个错误,如"文件上传时出错".这对我没有意义.
我正在使用"Eclipse版本:Juno Service Release 2".任何帮助将不胜感激 .
在我们的应用程序中,有一般使用的类(例如,一个包含项目配置参数的类),如下所示.
class DB{
public:
int projectVersion
int somethingSoMuchImportantAllOverTheProject
};
extern DB* pDB;
Run Code Online (Sandbox Code Playgroud)
因为所有其他类都将使用此类,所有这些类都需要以某种方式访问它.我们的解决方案是放置"extern DB*pDB;" 在其头文件下,无论谁需要它,都可以在包含标题后访问它.我想也许有更好的解决方案,并希望得到你的想法这个一般情况.
为了将我从输入文件中读取的内容复制到vector,我std::copy()按照将std :: ifstream读取到行向量的建议使用.
如果我使用以下问题会发生:
std::copy(std::istream_iterator<unsigned char>(inputfile),
std::istream_iterator<unsigned char>(),
std::back_inserter(myVector));
Run Code Online (Sandbox Code Playgroud)
myVector变量中缺少我文件的第16个字节.
但是,如果我使用以下代码:
inputfile.read((char*)&myVector[0], sizeof(int)*getfilesize(nameOfFile));
Run Code Online (Sandbox Code Playgroud)
然后该字节不再丢失.
我试图解析WAV文件,我在这上面浪费了太多时间,我希望我能从中学到新东西.你能否告诉我上面代码的第一个版本有什么问题?
在阅读有关范围的文档后,我相信任何std.algorithm函数都应该适用于包含关联数组的任何容器,
但是下面的代码失败了:
double[double] freqIntensity;
foreach (complexval; resultfft)
{
freqIntensity[arg(complexval)]++;
}
minPos!("a > b")(freqIntensity);
Run Code Online (Sandbox Code Playgroud)
有错误:
src\main.d(56): Error: template std.algorithm.minPos does not match any function template declaration. Candidates are:
C:\D\dmd2\windows\bin\..\..\src\phobos\std\algorithm.d(6321): std.algorithm.minPos(alias pred = "a < b", Range)(Range range) if (isForwardRange!(Range) && !isInfinite!(Range) && is(typeof(binaryFun!(pred)(range.front, range.front))))
src\main.d(56): Error: template std.algorithm.minPos(alias pred = "a < b", Range)(Range range) if (isForwardRange!(Range) && !isInfinite!(Range) && is(typeof(binaryFun!(pred)(range.front, range.front)))) cannot deduce template function from argument types !("a > b")(double[double])
src\main.d(56): Error: template instance minPos!("a > b") errors instantiating …Run Code Online (Sandbox Code Playgroud) 我现在正在使用wav文件,我正在解析它们.我现在不想使用库.我用fstream打开wav文件并将所有数据读取到vector.现在我想解析wav文件头.例如,我想获得第4到第8个字节之间的文件大小.我想将它分配给一个整数.我很容易用memcpy完成这个.但是因为它是C++我不想使用memcpy.我最终得到的解决方案:
std::vector<unsigned char>::iterator vectorIte = soundFileDataVec.begin();
vawParams.totalfilesize = 0;
//Since it is little endian I used reverse_copy
std::reverse_copy(vectorIte + 4, vectorIte + 7, (unsigned char*)&vawParams.totalfilesize);
Run Code Online (Sandbox Code Playgroud)
我不满意(unsigned char*)强制转换为整数指针.我怀疑有比我更好的方法.能告诉我一个更好的方法吗?
我知道当代码中没有任何令人困惑的for循环时,代码会更好.在可能的情况下重用标准库算法总是好的.但是,我发现迭代器和算法的语法看起来真的很混乱.
我想从我当前的项目中给出一个真实的例子:我想将内容复制vector<vector<QString>> in到vector<QVariant> out.我看不出以下区别:
for (int i = 0; i < in[0].size(); i++ )
{
if(in[0][i].isNull() || in[0][i].isEmpty() )
out[i] = "NONE";
else
out[i] = in[0][i];
}
Run Code Online (Sandbox Code Playgroud)
然后:
std::transform(in[0].begin(), in[0].end(), out.begin(), [](const QString& a)->QVariant{
if(a.isNull() || a.isEmpty() )
return "NONE";
else
return a;
});
Run Code Online (Sandbox Code Playgroud)
由于我们有visual studio 2012,我甚至必须输入我的lambda的返回值.使用范围之后:
in[0].map!( a => a.isNull() || a.isEmpty() ? "NONE" : a ).copy(out);
Run Code Online (Sandbox Code Playgroud)
在D语言中,我根本无法忍受std::transform上面的代码.我甚至不确定它是否比基本for循环更好.我的问题是:使用std::transform上面的代码比for循环好吗?
我需要用 QPainter 画一个圆圈。当我使用 drawEllipse 函数时:
void UserClass::Draw(QPainter &painter) {
painter.save();
painter.setBrush( GetColor() );
QPoint centerPosition = GetCenterPosition();
painter.drawEllipse( centerPosition, m_CircleOuterRadius, m_CircleOuterRadius);
painter.setBrush(QColor(0, 0, 0, 0));
painter.drawEllipse( centerPosition, m_CircleInnerRadius, m_CircleInnerRadius);
painter.restore();
}
Run Code Online (Sandbox Code Playgroud)
不幸的是结果不是我想要的。我想让内圈不被填满。这就是为什么我将 alpha 值设置为零,但当然它不起作用。我怎么能有一个圆,直到 qt 达到某个半径?
我有下面的代码
template<typename U, typename F >
U GetListAndSearchName( F listGetter, const std::string& stringName )
{
std::vector<UserType> newList;
for ( size_t i = 0; i < myList.size(); i++)
{
const std::vector<U>& list = listGetter(myList[i]);
for ( size_t i = 0; i < list.size(); i++ )
{
if ( list[i]->GetName() == stringName )
return list[i];
}
}
return U();
}
Run Code Online (Sandbox Code Playgroud)
甚至U存在于我的函数指针的返回类型中,它是模板参数F(我以后使用std :: mem_fn来创建它可能也是std :: function)当前我需要显式地将U的类型传递给编译器.
如何让我的旧Vs2010编译器推断出U的类型?