我必须使用许多可能的执行流修改一个非常大的方法.修改涉及使用在堆中分配char数组new.我想确保正确释放此数组,但我想避免delete[]在所有可能的执行流程中执行此操作.另外,我想为此目的做一些"更清洁"的事情,以避免未来的错误.
我曾考虑过分配数组,new然后将其包装到本地std::vector(但保留对原始指针的引用,因为该方法密集使用此引用)并让包装器在超出范围时删除原始指针.
我在这里附上一个例子.此示例的目的是显示使用原始指针执行的操作类型.
char *rawPtr = new char[1024];
std::vector wrapper(rawPtr, rawPtr + 1024); // <= Does it assure that rawPtr will be released properly?
...
for(int i = 0; i < 1024; i++)
rawPtr[i] = ...;
rawPtr += sizeof(...);
...
rawPtr -= ...;
if(...)
return ...;
return ...;
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,如果我能确定rawPtr无论程序失败,异常,传入return语句等都能正确发布.
PD.:我不能使用C++11,我对智能指针最相似的是auto_ptr这个用delete,而不是delete[].
当我使用 clang 来格式化我的 C++ 代码时,我遇到了一个问题:
priority_queue<int, vector<int>, greater<int> > q;
Run Code Online (Sandbox Code Playgroud)
将自动格式化为:
priority_queue<int, vector<int>, greater<int>> q;
Run Code Online (Sandbox Code Playgroud)
两个单独的 '>' 将被格式化为一个移位 >>。
那么我应该如何配置.clang-format文件来避免这种情况呢?
我将这个简单的代码编译为 g++ main.cpp -o main -std=c++03
#include <vector>
int main(){
std::vector<int> array;
std::vector<int> array2 = { 9, 7, 5, 3, 1 };
}
Run Code Online (Sandbox Code Playgroud)
我收到以下编译错误:
main.cpp: 在函数 'int main()':
main.cpp:39:18: 错误:在 C++98 中,'array2' 必须由构造函数初始化,而不是由 '{...}'
std::vector数组 2 = { 9, 7, 5, 3, 1 };
^~~~~~
main.cpp:39:43: 错误:无法将 '{9, 7, 5, 3, 1}' 从 '' 转换为 'std::vector'
std::vector array2 = { 9 , 7, 5, 3, 1 };
似乎即使我正在使用-std=c++03(初始化列表可用的地方)进行编译,但我仍在使用 C++98 标准。为什么会这样?
我知道此代码将使用更新的标准进行编译。
我正在写一个哈希类:
struct hashmap {
void insert(const char* key, const char* value);
char* search(const char* key);
private:
unsigned int hash(const char* s);
hashnode* table_[SIZE]; // <--
};
Run Code Online (Sandbox Code Playgroud)
因为insert()需要在插入新对时检查table [i]是否为空,所以我需要在启动时将表中的所有指针设置为NULL.
我的问题是,这个指针数组table_会自动初始化为零,还是我应该手动使用循环在构造函数中将数组设置为零?
我在C++ 03环境中工作,并将一个函数应用于地图的每个键是很多代码:
const std::map<X,Y>::const_iterator end = m_map.end();
for (std::map<X,Y>::const_iterator element = m_map.begin(); element != end; ++element)
{
func( element->first );
}
Run Code Online (Sandbox Code Playgroud)
如果key_iterator存在,相同的代码可以利用std::for_each:
std::for_each( m_map.key_begin(), m_map.key_end(), &func );
Run Code Online (Sandbox Code Playgroud)
那为什么不提供呢?有没有办法让第一种模式适应第二种模式?
给定C++ 03中的32位或64位整数,确定是否只有一位设置的有效方法是什么?(例如,值正好是1,2,4,8,16,32等中的一个)C++ 03库(或者如果不是C++ 11)是否有任何内置函数可以在我遇到的任何硬件上高效工作在吗?我想将它用于在多次出现时频繁发生的衰减消息.
说我有两个班A,并B和阶级的载体A如下:
class A {
int foo;
int bar;
void someMethod();
};
class B {
uint foo;
uint bar;
void someOtherMethod();
};
std::vector<A> va;
Run Code Online (Sandbox Code Playgroud)
并且我想将其解释va为B的向量,因为int并且uint可以重新解释.
重新解释的最佳做法是什么?例如,如果我想要调用someOtherMethod()上va,我能做到((std::vector<B> *)(&va))->someOtherMethod().但这是最好的做法吗?
在我看来,这reinterpret_cast<std::vector<B> >(va).someOtherMethod()不起作用.
另外,我正在研究C++ 03.
- 更新 -
很抱歉我误解了自己的问题.然而,我的问题与这个问题有很大的不同.所以我创造了另一个问题在这里.
我将很快结束这个问题:这个问题可以看作是一个独立的问题,我认为下面的答案之一已经足够被接受了.
我坚持GCC 4.4,所以尽管介绍-std=c++0x我的代码库没有使用lambdas.
是否有一个C++ 03相当于一个空的lambda [](){},我可以安全地使用它作为某种类型的泛型参数的默认参数Callback?
我问,因为旧的std::plus,std::less等了方便,但我似乎无法找到一个空操作,void-returning等同.
在我不应该用-std = c ++ 11编译的限制下,我想在以下变量中添加一个额外的变量,
std::map<unsigned,
std::map<unsigned,
std::pair<
std::pair<int, int>,
std::pair<bool, bool>
>
>
>
temp;
Run Code Online (Sandbox Code Playgroud)
并据此调整其初始化:
for (int i=0; i<100; ++i)
{
temp[i][i]=
std::pair<
std::pair<int, int>,
std::pair<bool, bool>
>
> (
std::pair<int, int> (intsX[i], intsY[i]),
std::pair<bool, bool> (boolsX[i], boolsY[i])
);
}
Run Code Online (Sandbox Code Playgroud)
我想将结构更改为:
std::map<unsigned,
std::map<unsigned,
std::pair<
std::pair<int, int>,
std::pair<
std::pair<bool, bool>,
double
>
>
>
>
temp;
Run Code Online (Sandbox Code Playgroud)
现在,我不知道如何更改初始化,例如......
for (int i=0; i<100; ++i)
{
temp[i][i]=
std::pair<
std::pair<int, int>,
std::pair<
std::pair<bool, bool>,
double
>
> (
std::pair<int, int> (intsX[i], intsY[i]),
std::pair<std::pair, …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
class TestLog: public std::stringstream
{
public:
~TestLog()
{
cout << (str()) << endl; // Why does this print an address ?
}
};
int main()
{
TestLog() << "Hello World!"; //test 1 print an address
stringstream ss;
ss << "Hello World!";
cout << (ss.str()) << endl; //test 2 print a string
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并输出:
0x401b90
你好,世界!
编译器信息:
g ++(GCC)4.8.5 20150623(Red Hat 4.8.5-11)
在我看来,(a)std :: stringstream的str()方法返回一个字符串.(b)std :: cout是std :: ostream的对象.因此,两个测试都将调用ostream的相同运算符函数并打印相同的"Hello …