请原谅我这个问题太傻了.使用RAII最有用的例子是:
void func(){
// create some object pointer using any smart pointer
// do some operation that may throw
return;
}
// whether method returns from the *return* statement or because of any exception it is guaranteed that the memory will be released
Run Code Online (Sandbox Code Playgroud)
本文说(如果我理解正确),如果运行时系统知道没有异常处理程序可以在抛出后捕获异常, 它可能会跳过调用自动对象的析构函数.
还有一个建议解决这一问题,即使用catch(..)在main.
现在我担心的是如果不使用所提出的解决方案,那么即使在使用RAII之后也可能存在资源泄漏.并且存在无法应用解决方案的情况(例如创建将由其他人使用的库).在这种情况下,可能会发生严重问题,例如破坏包含有价值信息的文件.
我们真的应该关注这个问题吗?或者我只是错过了一些东西?
我知道之前曾问过这个问题,但我不明白为什么它在我的情况下不起作用
void calc(vector<char> zodis1, vector<char> zodis2, vector<char> zodisAts,int zo1,int zo2,int zoA)
{
int i,u=0;
int zod1[zo1]=0;
int zod2[zo2]=0;
int zodA[zoA]=0;
}
Run Code Online (Sandbox Code Playgroud)
zod1,zod2,zoA中的所有3个都给出了错误:variable-sized object may not be initialized c++
但是编译器应该知道zo 初始化之前的含义是什么cout<<zo1;工作并打印出来的含义
所以有什么问题?
我正在使用该socket模块在 Python 3.3 中制作服务器和客户端。我的服务器代码工作正常,但此客户端代码返回错误。这是代码:
import socket
import sys
import os
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_address = ('192.168.1.5', 4242)
sock.bind(server_address)
while True:
command = sock.recv(1024)
try:
os.system(command)
sock.send("yes")
except:
sock.send("no")
Run Code Online (Sandbox Code Playgroud)
这是错误:
Error in line: command = sock.recv(1024)
OSError: [WinError 10057] A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied
Run Code Online (Sandbox Code Playgroud)
这到底是怎么回事?
新学员; 关于指针的一些难题;
当我从书本中学习时,在使用指针之前必须对其进行初始化,因此我们通常会这样使用
int a = 12;
int * p = &a;
Run Code Online (Sandbox Code Playgroud)
所以我明白为什么int* p = 12 是错的,因为它没有地址;
然后我在编码的时候找到了一些东西,就是这样:
char * months[12] = {"Jan", "Feb", "Mar", "April", "May" , "Jun", "Jul"
,"Aug","Sep","Oct","Nov","Dec"};
Run Code Online (Sandbox Code Playgroud)
然后又出现了另一个常用的情况,那就是:
char *p = "string"; (this is ok , why int * a = 12 can't be allowed ?)
Run Code Online (Sandbox Code Playgroud)
我很困惑.什么时候初始化,如何?为什么int * a = 12不能自动初始化?也许是关于记忆的安排.
这是我收到的错误。
Error 4 error C2511: 'Vector<T> Menus::sortListBy(sortType,Vector<T>)'
: overloaded member function not found in 'Menus' z:\documents\visual
studio 2010\projects\oo_cw\oo_cw\menus.cpp 410 1 OO_CW
Run Code Online (Sandbox Code Playgroud)
我相信这与我尝试使用包含在标头中但似乎没有转移到其他类的枚举有关。
这是所涉及的 2 个标题以及我正在努力解决的功能:
菜单.cpp:
Vector<connections> Menus::sortListBy(sortType sortKey,Vector<connections> sortList){}
Run Code Online (Sandbox Code Playgroud)
菜单.h
#pragma once
#include "std_lib_facilities.h"
#include "Airport.h"
class Journey;
#include <string>
typedef enum {BACK,FORWARD,INVALID,OPTIONS} result;
typedef enum {BOOK,VIEW,EXIT} firstChoice;
class Menus
{
public:
Menus(void);
~Menus(void);
firstChoice firstMenu();
Airport bookingMenuFirst(Vector<Airport>);
Airport bookingMenuSecond(Vector<connections>,Vector<Airport>);
airlines bookingMenuThird(Airport,Airport,Journey&);
string bookingMenuDate();
bool showReciept(string,string,string,string,double,double,double);
string showRecieptNames();
void readReciept(string);
void optionMenu(Journey);
Vector<connections> sortListBy(sortType,Vector<connections>);
};
Run Code Online (Sandbox Code Playgroud)
旅程.h
#pragma once
#include …Run Code Online (Sandbox Code Playgroud) 我想编写一个方法,将Base对象指针作为参数传递,并在方法内部将其转换为派生对象指针.
void func( const Base* const obj){
Derived* der = dynamic_cast<Derived*>(obj);
}
Run Code Online (Sandbox Code Playgroud)
但它显示错误,因为动态强制转换不能抛弃const说明符.但我不明白为什么const必须在这里删除说明符,我所做的只是创建一个派生指针,它应指向基指针之后的一些偏移量.我也试过const Derived* const der = dynamic_cast<Derived*>(obj);,但没有结果.
将参数传递为非常重要const.我怎样才能做到这一点?我必须做这件事的第一应用丑陋的方式const_cast,然后dynamic_cast?有没有更好的方法?
我正在浏览链接
\n\n\n\n我对一些说法感到困惑。在第一个链接中,它说
\n\n\n\n\nQThread 中的所有函数都是编写的,旨在从创建线程调用,而不是从 QThread 启动的线程调用。
\n
虽然它建议使用moveToThread将对象移动到新线程,而不是子类化QThread。我的问题是:
run方法调用的默认实现exec,会创建一个事件循环,当使用 改变对象的线程关联性moveToThread时,所有的操作slots都会在新线程中执行,而不是在创建线程上执行,这与前面提到的预期用途相矛盾相矛盾。我错过了什么吗?
第二个问题:
\n\n在第三个链接中说
\n\n\n\n\n事件队列属于线程而不是事件循环,并且它\xe2\x80\x99被该线程中运行的所有事件循环共享。
\n
我的问题是单个线程中如何可以有多个事件循环?我的理解是,事件循环通过事件队列循环,直到exit/terminate被调用,并处理每个event到达该队列的事件。如果这是真的,一个循环将永远不会结束(除非 exit/terminate被调用),另一个循环如何开始?任何演示它的示例代码都将受到高度赞赏。
假设我有B从类继承的类A,并考虑以下代码:
void f(B& b) {
A& a = b;
g(a);
}
Run Code Online (Sandbox Code Playgroud)
有没有办法避免演员的额外线?请注意,以下static_cast版本不相同,因为除了向下转换之外它还允许向上转换:
// Potentially dangerous: doesn't check that B inherits from A
void f(B& b) {
g(static_cast<A&>(b));
}
Run Code Online (Sandbox Code Playgroud)
编辑:我不能依靠隐式强制来完全避免演员阵容,就像Brian的回答一样.今天的原因是g模板,我想避免不必要的实例化,但过去还有其他原因.在任何情况下,我都需要某种显式转换来获取类型的值A&.
我想定义宏像
#define DECLARE_FUNCTION(funcName, retType, args) retType funcName(args)
Run Code Online (Sandbox Code Playgroud)
并使用它
DECLARE_FUNCTION(intFunc, int, void);
DECLARE_FUNCTION(voidFunc, void, double, double);
DECLARE_FUNCTION(doubleFunc, double, int, double, double);
Run Code Online (Sandbox Code Playgroud)
期待那些将扩展到
int intFunc(void);
void voidFunc(double, double);
double doubleFunc(int, double, double);
Run Code Online (Sandbox Code Playgroud)
这当然不起作用,因为用三个参数定义的宏会占用所有"冗余"参数,结果是
int intFunc(void);
void voidFunc(double);
double doubleFunc(int);
Run Code Online (Sandbox Code Playgroud)
我不介意定义不同的情况下宏,像
DECLARE_FUNCTION_WITH_0_ARGS,DECLARE_FUNCTION_WITH_1_ARG,DECLARE_FUNCTION_WITH_2_ARGS等等.但问题是,这些宏并不像我在本例中得到以原始的,它们包含了很多行代码,这将是很好的不重写它们,但只定义一个非平凡的宏,eq DECLARE_FUNCTION_WITH_1_ARG,并从所有其他宏的实体中调用它.
我知道标准没有规定如何打包数据.我只是试图了解类的内存布局(尤其是如何dynamic_cast<void*>保证返回指向最派生类的开头的指针).我想不出有关以下代码输出的任何解释:
struct A{ int a;};
struct B{ int b;};
struct C: public A, public B { int c;};
struct D:public C {int d;};
int main(){
D* ob=new D;
A* a = ob;
B* b = ob;
C* c = ob;
}
Run Code Online (Sandbox Code Playgroud)
打印指针的值表明,a,c,d有总是相同的值,只b添加4个字节偏移量.这是偶然的吗?或者背后有一个逻辑?
编辑:
从概念上讲,布局应该像图像一样,但不知何故,点A,C和D合并为一个.
c++ ×9
c ×2
casting ×1
const ×1
const-cast ×1
dynamic-cast ×1
enums ×1
exception ×1
inheritance ×1
macros ×1
overloading ×1
pointers ×1
python-3.x ×1
qeventloop ×1
qobject ×1
qt ×1
qthread ×1
raii ×1
sockets ×1