CSDN问答——精选问答Vol.9
Posted 问答小精灵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CSDN问答——精选问答Vol.9相关的知识,希望对你有一定的参考价值。
《精选问答》挑选CSDN问答频道每周最新最热的优质回答,为大家提供可信赖的优质解答,点击查看更多已解决问题
目录
2、封装为类的tkinter,怎么在类外把信息写到Tkinter的text控件中
5、python 连接多个sql sql并执行sql 怎样用for或其它循环操作
1、C++内存管理 怎么避免内存重复释放?
问题描述:
两个实例的成员变量指向了同一块内存,当我要销毁这两个实例时,同一块的内存被释放了两次。
重复释放内存是个很危险的操作,那我现在该怎么解决这个问题?
我的理想办法是在析构函数那加一条“内存是否为空”的判断,但就一直找不到实现方法。。
还是说这就是C++内存管理的难点,只能通过合理的设计结构来避免?
#include <cstdio>
class Example{
public:
int *n;
Example(int *n):n(n){}
~Example(){
delete n; // if(n != NULL)并不管用, 有啥其他检查方法吗?
n = NULL;
printf("已释放内存\\n");
}
};
int main(){
int *x = new int(666);
Example *a = new Example(x); //...
Example *b = new Example(x); //两个类中的指针指向同一块内存
printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
delete a;
printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
delete b; //对 x 指向的内存进行了二次释放!
return 0;
}
运行结果:↓
a->n: 00B12E20, b->n: 00B12E20, x: 666
已释放内存
a->n: 00B12E20, b->n: 00B12E20, x: 11611744
已释放内存
解决方案——来自@bostonAlen的回答
你这里为空判断无法生效,是因为delete后,n变成0xDDDDDDDD , 自然NULL无法判断
#include <cstdio>
class Example{
public:
int *n;
Example(int *n):n(n){}
~Example(){
if(n != (int *)0xDDDDDDDD)
{
delete n; // if(n != NULL)并不管用, 有啥其他检查方法吗?
n = NULL;
printf("已释放内存\\n");
}
}
};
int main(){
int *x = new int(666);
Example *a = new Example(x); //...
Example *b = new Example(x); //两个类中的指针指向同一块内存
printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
delete a;
printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
delete b; //对 x 指向的内存进行了二次释放!
return 0;
}
但是这样还是有问题,第二次析构,又无法判断了,还是会对损坏。
最好的还是,不进行地址的指向,仅仅是数据的赋值。
#include <cstdio>
class Example{
public:
int *n;
Example(int *n):n(new int()){*n = *n;}
~Example(){
if(n != (int *)0xDDDDDDDD || n!=NULL)
{
delete n; // if(n != NULL)并不管用, 有啥其他检查方法吗?
n = NULL;
printf("已释放内存\\n");
}
}
};
int main(){
int *x = new int(666);
Example *a = new Example(x); //...
Example *b = new Example(x); //两个类中的指针指向同一块内存
printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
delete a;
printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
delete b; //对 x 指向的内存进行了二次释放!
printf("a->n: %p, b->n: %p, x: %d\\n", a->n, b->n, *x);
return 0;
}
本题更多回答戳链接:https://ask.csdn.net/questions/7470237
2、封装为类的tkinter,怎么在类外把信息写到Tkinter的text控件中
问题描述:
封装为类的tkinter,怎么在类外把信息写到Tkinter的text控件中
import tkinter as tk
from tkinter import scrolledtext
class App:
def __init__(self, window):
self.window = window
self.window.title("main")
self.window.geometry("600x300")
self.labelframe()
self.text_insert()
def labelframe(self):
lf = tk.LabelFrame(
self.window, text="运行信息", font=("微软雅黑", 10, "bold"), padx=10, pady=10
)
lf.place(x=20, y=20)
text = scrolledtext.ScrolledText(lf, height=5, width=65, font=("微软雅黑", 10))
text.grid()
self.text = text
def text_insert(self):
self.text.insert("end", "Part_1:这是类内写入的信息... \\n")
# 怎么在类外把信息写到Tkinter的text控件中
message = "Part_2:这条信息,在类外写入Tkinter text控件"
root = tk.Tk()
app = App(root)
root.mainloop()
解决方案——来自@soar303的回答
import tkinter as tk
from tkinter import scrolledtext
class App:
def __init__(self, window):
self.window = window
self.window.title("main")
self.window.geometry("600x300")
self.labelframe()
self.text_insert()
def labelframe(self):
lf = tk.LabelFrame(
self.window, text="运行信息", font=("微软雅黑", 10, "bold"), padx=10, pady=10
)
lf.place(x=20, y=20)
text = scrolledtext.ScrolledText(lf, height=5, width=65, font=("微软雅黑", 10))
text.grid()
self.text = text
def text_insert(self):
self.text.insert("end", "Part_1:这是类内写入的信息... \\n")
def change(self,txt):
self.text.insert("end",txt)
# 怎么在类外把信息写到Tkinter的text控件中
message = "Part_2:这条信息,在类外写入Tkinter text控件"
root = tk.Tk()
app = App(root)
app.change(message)
root.mainloop()
本题更多回答戳链接:https://ask.csdn.net/questions/7468861
3、QT定义槽函数获取QTableview的数据出现闪退
问题描述:
在做一个电子商城系统,C++语言,用的数据库是sql server,在定义槽函数之前都可以正常运行,定义槽函数以后,程序一关联到这个事件信号就闪退,求解!
void market::tableclick()
{
int row =ui->tableView->currentIndex().row();
qDebug()<<row;
QModelIndex index1= model->index(row,0);
QString id =model->data(index1).toString();
ui->lineEdit->setText(id);
}
解决方案——来自@qfl_sdu的回答
int row =ui->tableView->currentIndex().row();
if(row <0) return;
QAbstractItemModel *model = ui->tableView->model();
QModelIndex index1= model->index(row,0);
QString id =model->data(index1).toString();
ui->lineEdit->setText(id);
本题更多回答戳链接:https://ask.csdn.net/questions/7465950
4、html文本如何一个个显示并不断上移
问题描述:
我的字一个个显示了,但字多的话得自己往下翻,想让他自己不断上移
解决方案——来自@CSDN专家-天际的海浪的回答
div设置overflow: hidden 或者 auto; 和height: 500px;
然后每次更新显示后执行txt.scrollTop = txt.scrollHeight;让滚动条到最底。
如果是要整个页面的滚动条到最底,可以用。
var root = document.compatMode=="CSS1Compat" ? document.documentElement : document.body;
root.scrollTop = root.scrollHeight;
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title> 页面名称 </title>
<script type="text/javascript">
var i = 0;
var content = "文本内容1 文本内容2 文本内容3 文本内容4 文本内容5 文本内容6 文本内容7 文本内容8 文本内容9 文本内容10 文本内容11 文本内容12 文本内容13 文本内容14 文本内容15 文本内容16 文本内容17 文本内容18 文本内容19 文本内容20";
function show() {
var txt = document.getElementById("txt");
txt.innerText = content.substr(0,i);
var root = document.compatMode=="CSS1Compat" ? document.documentElement : document.body;
root.scrollTop = root.scrollHeight;
i++;
if (i<=content.length) {
setTimeout("show()", 300);
}
}
</script>
</head>
<body onload="show()" style="font-size: 120px;">
<div id="txt"></div>
</body>
</html>
本题更多回答戳链接:https://ask.csdn.net/questions/7468759
5、python 连接多个sql sql并执行sql 怎样用for或其它循环操作
问题描述:
我想连接20个sqlserver,下面是单独连接并运行,怎样一次执行连接20个sql 并在上面执行写好的sql,连接异常时要报错.谢谢
sqlserver='xx.xx.xxx.32',sqlserver1='xx.xx.xxx.33',sqlserver2='xx.xx.xxx.34'
try:
conn = pymssql.connect(sqlserver, user, password, database)
sql_path = 'C:\\count.sql'
sql = open(sql_path,'r',encoding ="utf-8-sig")
sqltxt = sql.readlines()
sql.close()
sql = "".join(sqltxt)
df = pd.read_sql(sql,conn)
except e
try:
conn1 = pymssql.connect(sqlserver1, user, password, database)
sql_path = 'C:\\count.sql'
sql = open(sql_path,'r',encoding ="utf-8-sig")
sqltxt = sql.readlines()
sql.close()
sql = "".join(sqltxt)
df = pd.read_sql(sql,conn1)
except e
解决方案——来自@the file is not的回答
1 服务可以写在一个sqlserver里做成一个列表或者字典元组将数据信息进行存储 如 ['xx.xx.xxx.31','xx.xx.xxx.32','xx.xx.xxx.33']。。。等
2 后将数据连接的功能函数封装成一个类,将数据的连接,执行,关闭写到单独的方法里,用self来进行游标的调用,(面向对象的思维,指把每一个sqlserver,当成一个对象去连接,然后去生成一个一个对象)
3 异常可以在每个函数里进行添加,看起来清晰,而且错误定位准确。异常捕获使用try处理!
本题更多回答戳链接:https://ask.csdn.net/questions/7468441
6、js定时器中的间隔时间能否设置为随机数
问题描述:
timeout能不能设置为随机数,达到每个执行周期不一样的效果?如果不能,有没有其他方法达到此效果?
解决方案——来自@黑白猫妈的回答
把setTimeout封装在函数内部,在setTimeout里面生成随机数之后再调用函数本身,把生成的随机数传进去,记得加判断条件,不然会一直执行
function setTimer(n){
setTimeout(() => {
const timestep = Math.random()*1000;
setTimer(timestep);
},n)
}
setTimer(500);
本题更多回答戳链接:https://ask.csdn.net/questions/7469047
7、如何getch区分大写字母P与方向键下键?
问题描述:
我们在做2048游戏的时候,利用P暂停游戏,但是当使用下键的时候,游戏就暂停了,后来查资料发现,下键和p的ASCII码都是80,应该怎么区分呢?
解决方案——来自@blkq的回答
getch读方向键要读两次,第一次是returns 0 or 0xE0,第二次是实际key code。
或者用一下代码这样你就可以知道你想知道的某个按键的键盘码了;
#include"stdio.h" /*TC环境下*/
#include"bios.h"
main()
{
int key;
while(1)
{
if(bioskey(1)) /无等待,看是否有按键盘/
{
key=bioskey(0); /若有,则读取按键码/
printf("You have pressed the %d",key); /输出键盘码/
break;
}
}
getchar();
}
帮你测试了一下:
↑是18432;↓是20480;H是9064;P是6512;
而且读取键盘不要用getch()之类的;
用bioskey()或是kbhit()(如果是编小游戏的话)http://bbs.bccn.net/thread-123801-1-1.html
以上是关于CSDN问答——精选问答Vol.9的主要内容,如果未能解决你的问题,请参考以下文章